2009-10-15 5 views
8

Учитывая двойную переменную с именем sizeValue и sizeValue содержит что-то отличное от 0, что является наиболее эффективным способом определения того, что sizeValue содержит значение, которое является целым числом?Самый быстрый наиболее эффективный способ определения десятичного значения является целым числом в Java

В настоящее время я использую

sizeValue% 1 == 0

любые другие быстрые способы?

+0

Это довольно быстро уже. – OscarRyz

ответ

6

дать попробовать на Math.ceil:

private static boolean isInt(double x) { 
    return x == Math.ceil(x); 
} 

EDIT

Я сделал несколько тестов с помощью следующих методов:

private static boolean isInt1(double x) { 
    return x == (int) x; 
} 

private static boolean isInt2(double x) { 
    return x == Math.ceil(x); 
} 

private static boolean isInt3(double x) { 
    return x % 1 == 0; 
} 

isInt1 является быстрее из них (на a sunjre 1.6)

+0

jms, вы можете изменить свой голос сейчас. – akf

+0

Быстрее ли Math.ceil? - Если да, то почему? Какую магию он делает? :-) – Adamski

+0

+1 Я бы использовал Math.floor, но это не имеет большого значения. – starblue

3

Я не уверен, если это быстрее, но вы могли бы бросить своего двойника к междунар и тест на равенство:

double d = 123.456; 
boolean dIsAnInteger = (d == (int)d); 
+0

-1 Не работает за пределами 2^31. Использование long было бы чуть менее ошибочным. – starblue

1

Внимание: Вы бы 0.9999999999999999 целое число? Возможно нет. Но смотреть на это:

double val = 0; 
for(int i=0;i<10;i++) 
    System.out.println(val+=0.1); 

Это печатает:

0.1 
0.2 
0.30000000000000004 
0.4 
0.5 
0.6 
0.7 
0.7999999999999999 
0.8999999999999999 
0.9999999999999999 

Что является проблематичным, поскольку в конце программы val содержит то, что вы думаете, должно быть целым числом, но это не так.

Так что я хотел бы сделать мой метод немного медленнее (но более правильно) путем интегрирования дельты как JUnit делает:

private static boolean isInt(double x, double delta) { 
    double ceil = Math.ceil(x); 
    return x-delta<ceil && x+delta>ceil; 
} 

и, конечно, обеспечить тот же метод, с разумным по умолчанию:

private static boolean isInt(double x) { 
    return isInt(x, 0.000000001); 
} 

Теперь isInt(val), наконец, возвращает true.