如何比较Java中的两个double值?

Lio*_*ion 50 java

Java中两个double值的简单比较会产生一些问题.让我们考虑Java中的以下简单代码片段.

package doublecomparision;

final public class DoubleComparision 
{
    public static void main(String[] args) 
    {
        double a = 1.000001;
        double b = 0.000001;

        System.out.println("\n"+((a-b)==1.0));
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码似乎返回true,表达式的评估((a-b)==1.0)却没有.它会返回,false因为对此表达式的求值0.9999999999999999实际上是预期的1.0,1.0因此不等于,因此条件求值为boolean false.克服这种情况的最佳方法是什么?

Kev*_*vin 85

基本上你不应该进行精确的比较,你应该这样做:

double a = 1.000001;
double b = 0.000001;
double c = a-b;
if (Math.abs(c-1.0) <= 0.000001) {...}
Run Code Online (Sandbox Code Playgroud)

  • 您可能想看看Double的比较方法.请访问此链接:http://www.tutorialspoint.com/java/lang/double_compare.htm (13认同)
  • 但是如果使用Double.compare,请注意(1)如果d1和d2都表示Double.NaN,则该方法返回true,即使Double.NaN == Double.NaN的值为false; (2)如果d1表示+0.0而d2表示-0.0,反之亦然,则该方法返回值false,即使+0.0 == - 0.0的值为true.此定义允许哈希表正常运行. (13认同)

Zak*_*deh 11

请使用java.math.BigDecimal,而不是使用双精度来表示十进制arithemetic.它会产生预期的结果.

有关参考,请参阅此stackoverflow问题

  • BigDecimal有时不是一个可行的解决方案. (18认同)
  • 但海报特别询问比较双打 (3认同)

小智 5

您可以使用Double.compare ; 它比较两个指定的double值。

  • 我不相信Double.compare本身可以解决发布者提出的问题。您仍然需要吸收和阈值 (10认同)
  • `compare` 的*优点*是它考虑了 `NaN` 和 `-0.0` - 问题肯定不能由此解决 (2认同)
  • 我相信它确实如此,只需浏览:http://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/java.base/share/classes/java/lang/Double.java#l1016 和 http ://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/java.base/share/classes/java/lang/Double.java#l815 (2认同)