2016-02-27 2 views
1

Это то, что я должен знать о плавающей точке равен операция:Floating сравнения точки без допуска

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

Т.е

/** Compare two doubles, using default epsilon */ 
public static boolean equals(double a, double b) { 
    return equals(a, b, EPSILON); 
} 

Это единственный метод или есть ли другой способ, чтобы сравнить точное значение с плавающей запятой без допуска.

+1

set EPSILON to 0. – bmargulies

+3

Использовать оператор '==' ... – fabian

+0

Почему вы хотите точно сравнить два числа с плавающей запятой? – u8sand

ответ

2

Пожалуйста, обратите внимание, что не существует такого понятия, как точность в плавающей точку из-за фундаментальное ограничение двоичного кода. Вы не можете выразить десятичное значение в двоичном формате точно, вместо этого половина, четверти (и другие отношения с знаменателем, являющиеся степенью двух) используются для выражения значений, «достаточно близких» в пределах некоторого приемлемого допуска. Вы не можете удалить этот допуск и сравнить точные значения, потому что иначе вы не можете выразить десятичные числа в двоичном формате.

Полезный link.

UPDATE: Только что нашел в stackoverflow this great response, так что мне не нужно писать все это. Прочтите это и, возможно, вы рассмотрите возможность использования BigDecimal для этой задачи.

1

Использовать статическую Double#compare(double d1, double d2) метод для внутреннего double Представление сравнения если вам это действительно нужно.

3

Оператор == сравнивает два значения double для точного равенства.

Пример:

1.0 == 2.0 - 1.0 // true 
0.1 + 0.2 == 0.3 // false 
0.25 == 0.125 + 0.125 // true 
1.0/3.0 == 2.0/6.0 // true 
1

Рекомендация просто использовать == или использовать допуски (эпсилон) неверны. Они дадут неожиданные результаты, если значения float равны NaN (а не числу). Вместо этого вы должны использовать floatToIntBits Why use Float.floatToIntBits() in Java float comparisons?

Смежные вопросы