没有任何容差的浮点比较

时间:2016-02-27 12:52:06

标签: java

这就是我对浮点等于操作的了解:

  

为了实际比较浮点数的相等性,通常需要在一些微小的允许差异范围内进行比较;这个范围通常被称为公差或epsilon。

即,

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

这是唯一的方法,还是有任何其他方法来比较没有任何容差的精确值浮点数。

4 个答案:

答案 0 :(得分: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 :(得分:2)

请注意,由于二进制代码的基本限制,浮点中没有精确性。你不能准确地用二进制表示十进制,而是减半,四分之一(以及其他分母为2的幂的比率)用来表示足够接近的值'在一些可接受的容忍度您无法删除此容差并比较确切的值,因为否则您无法用二进制表示小数。

有用的link

更新: 刚刚在stackoverflow上找到了这个很棒的response,所以我不必全部写出来。阅读本文,也许你会考虑使用BigDecimal来完成手头的任务。

答案 2 :(得分:1)

使用静态Double#compare(double d1, double d2)方法进行内部double表示比较如果您确实需要

答案 3 :(得分:1)

建议只使用==,或使用容差(epsilon)是错误的。如果浮点值是NaN(不是数字),它们将给出意外的结果。您应该使用floatToIntBits Why use Float.floatToIntBits() in Java float comparisons?