【问题标题】:how should I compare Double value with Long.MAX_VALUE? and Long.MAX_VALUE+1d我应该如何将 Double 值与 Long.MAX_VALUE 进行比较?和 Long.MAX_VALUE+1d
【发布时间】:2012-12-20 18:57:08
【问题描述】:

我想比较两个双精度值如下:

Double doubleValue = Double.valueOf(Long.MAX_VALUE);

Double doubleValue2 = Double.valueOf(Long.MAX_VALUE+1d);

显然 doubleValue 和 doubleValu2 不相等,由于 1d 加法,2nd 更大。

但无论我使用 compare() 还是 equals() 方法,这两种方法都会为两个值返回相等的结果。有什么方法可以在这里比较而不丢失准确性。

提前致谢。

【问题讨论】:

  • 这两个双精度值完全相等的,因为双精度值没有足够的精度来衡量差异。
  • 我认为您错误地使用了“显然”这个词。 “显然是 XYZ”是指根据现有证据,XYZ 似乎是真实的。我想您可能的意思是您期望数字相同,但显然它们不一样。
  • double 会产生相同的结果时,我会避免使用Double,因为它会增加您的示例(和一般代码)不需要的复杂性。

标签: java comparison double


【解决方案1】:

这是因为在将 long 转换为 double 时会损失精度

    double d1 = (double)Long.MAX_VALUE;
    double d2 = Long.MAX_VALUE + 1.0;
    System.out.println(d1);
    System.out.println(d2);

它给出相同的数字

9.223372036854776E18
9.223372036854776E18

long 有 32 位,double 的有效位有 53 位 http://en.wikipedia.org/wiki/Double-precision_floating-point_format。十进制最大long = 9223372036854775807,为19位,double最多可容纳17位

【讨论】:

    【解决方案2】:

    Long.MAX_VALUE 有 63 个有效位。 double 不能精确地表示任何超过 53 个有效位的数字。如果您想使用大于 Long.MAX_VALUE 的整数进行精确计算,我建议使用 java.math.BigInteger。

    import java.math.BigInteger;
    
    public class Test {
      public static void main(String[] args) {
        BigInteger longMax = BigInteger.valueOf(Long.MAX_VALUE);
        BigInteger plusOne = longMax.add(BigInteger.ONE);
        System.out.println(longMax.equals(plusOne));
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 2013-05-08
      • 2023-03-12
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 2015-10-29
      • 2015-06-25
      • 2011-06-22
      相关资源
      最近更新 更多