Округление с плавающей точкой (в Java) - PullRequest
1 голос
/ 15 августа 2010

Как лучше всего определить, не имеет ли данное число с плавающей запятой (или двойной) значащих десятичных разрядов.

f(234.0)  = true
f(34.45)  = false
f(3.1322) = false

т.е. эквивалент

EQ(((int)number) * 1.0 , number)

где EQ - это заданный метод для сравнения чисел с плавающей запятой, и можно предположить, что число с плавающей запятой соответствует целому числу.

Ответы [ 3 ]

2 голосов
/ 16 августа 2010

Math.rint(x) == x

Math.rint() возвращает double, поэтому он также работает для больших чисел, когда long результат Math.round() переполнен.

Обратите внимание, что это также верно для положительной и отрицательной бесконечности. Вы можете явно исключить их с помощью Math.rint(x) == x && !Double.isInfinite(x).

1 голос
/ 15 августа 2010

Округлите значение до ближайшего целого числа и вычислите абсолютную разницу до фактического значения.

Если эта разница меньше определенного процента от фактического значения, вы близки «достаточно».

0 голосов
/ 15 августа 2010

Вы можете попробовать что-то вроде этого:

public static boolean f(double d) {
    return d % 1 == 0;
}
...