Самый быстрый способ определения десятичного значения - целое число в Java

121
16

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


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


sizeValue% 1 == 0


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

спросил(а) 2009-10-16T00:02:00+04:00 10 лет, 11 месяцев назад
1
Решение
106

попробуйте Math.ceil:


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

ИЗМЕНИТЬ

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


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 является более быстрым из них (на солнечнике 1.6)

ответил(а) 2009-10-16T00:10:00+04:00 10 лет, 11 месяцев назад
81

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

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

ответил(а) 2009-10-16T00:10:00+04:00 10 лет, 11 месяцев назад
57

Предупреждение: вы считали бы 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.

ответил(а) 2010-02-25T08:44:00+03:00 10 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема