Java 使用<;,=,比较两个固定双精度>;。真的有问题吗?

Java 使用<;,=,比较两个固定双精度>;。真的有问题吗?,java,numbers,compare,theory,point,Java,Numbers,Compare,Theory,Point,我想检查一个double是否小于、等于或大于另一个double。尽管我读了很多关于浮点数和双倍由于计算机在二进制级别上的计算方式而无法精确比较的文章,但到目前为止,使用简单的二进制运算符非常有魅力。我用几十个不同的数字对它进行了测试,到目前为止,它还没有让我失望过一次 那么,在我的案例中,这样比较它们真的有问题吗?如果有,为什么我不能找到它,如何修复它 编辑:我知道0.1+0.2!=如果我决定比较它们,则为0.3。问题是-我只想比较两个固定的双倍的。我不必比较0.1+0.2和0.3。我最多只能比

我想检查一个
double
是否小于、等于或大于另一个
double
。尽管我读了很多关于
浮点数
双倍
由于计算机在二进制级别上的计算方式而无法精确比较的文章,但到目前为止,使用简单的二进制运算符非常有魅力。我用几十个不同的数字对它进行了测试,到目前为止,它还没有让我失望过一次

那么,在我的案例中,这样比较它们真的有问题吗?如果有,为什么我不能找到它,如何修复它


编辑:我知道
0.1+0.2!=如果我决定比较它们,则为0.3。问题是-我只想比较两个固定的
双倍的
。我不必比较
0.1+0.2
0.3
。我最多只能比较
0.3
0.3
。或
0.4
0.3
。差不多吧。我真的需要使用BigDecimal、epsilon或其他什么吗?

double
s是十进制数的离散表示形式。这意味着并非所有数字都可以用双精度表示

例如,
double
不能准确地表示一些非常大的数字,在这种情况下,它们被“四舍五入”到最接近的可用双精度。例如,见:

public static void main(String[] args) {
  double d1 = 1e50;
  double d2 = d1 + 1;
  System.out.println(d2 > d1); //false
  System.out.println(d2 == d1); //true
}

double
s是十进制数的离散表示形式。这意味着并非所有数字都可以用双精度表示

例如,
double
不能准确地表示一些非常大的数字,在这种情况下,它们被“四舍五入”到最接近的可用双精度。例如,见:

public static void main(String[] args) {
  double d1 = 1e50;
  double d2 = d1 + 1;
  System.out.println(d2 > d1); //false
  System.out.println(d2 == d1); //true
}

下面是一个使用float可能导致错误的示例

System.out.println(1.0 - 0.2 - 0.3 - 0.4 - 0.1); // Is not 0.0

如果需要任意精度的十进制数,请使用
BigDecimal

,下面是一个使用float可能导致错误的示例

System.out.println(1.0 - 0.2 - 0.3 - 0.4 - 0.1); // Is not 0.0
如果需要任意精度的十进制数,请使用
BigDecimal

运算符
不会有问题

==
操作符将对任何真实数据产生问题。那么你还没有遇到问题?嗯,在雷雨期间,你可以在高尔夫球场上跑来跑去,在头上挥舞着球杆,而不会被闪电击中。但这并不意味着你就不会这样。

操作人员没有问题

==
操作符将对任何真实数据产生问题。那么你还没有遇到问题?嗯,在雷雨期间,你可以在高尔夫球场上跑来跑去,在头上挥舞着球杆,而不会被闪电击中。但这并不意味着你就不会这样。

double
是完全可以比较的。出现问题主要有两个原因

  • 许多人认为使用
  • double的数学与使用real的数学是一样的。事实并非如此。关于什么东西应该完全相等的许多假设不容易(或根本不可能)从real转换为double
  • “有趣的事情”,如扩展精度不可预测地激活(使用
    strictfp
  • 和往常一样,其他答案都是错误的。
    double
    不能“表示”一个数字范围(你可以假装是这样,但最终一个
    double
    只有一个确切的值,不知道它要表示什么样的“范围”)。就结果“有趣”而言,
    double
    的等式可以产生“有趣的结果”的答案是正确的,但问题在于预期结果,而不是结果本身。如果你期望的是正确的事情,那就没有问题。

    double
    是完全可比的。出现问题主要有两个原因

  • 许多人认为使用double的数学与使用real的数学是一样的。事实并非如此。关于什么东西应该完全相等的许多假设不容易(或根本不可能)从real转换为double
  • “有趣的事情”,如扩展精度不可预测地激活(使用
    strictfp

  • 和往常一样,其他答案都是错误的。
    double
    不能“表示”一个数字范围(你可以假装是这样,但最终一个
    double
    只有一个确切的值,不知道它要表示什么样的“范围”)。就结果“有趣”而言,
    double
    的等式可以产生“有趣的结果”的答案是正确的,但问题在于预期结果,而不是结果本身。如果你期待正确的事情,那就没有问题。

    如果你与
    =
    相比,你肯定会遇到问题。与
    ==
    相比,情况更糟,但仍然存在问题。另外,还有一个具体的例子,可能是@BiltheLizard的重复,我已经看到了。事情是。。我只是有两个固定的(!)双倍数字。。我不做任何手术,但在他们的竞争。这就是我的问题所在!也编辑了我的作品<真正相等的code>double也将真正比较相等(除了
    NaN
    )。
    ==
    运算符会比较双值是否相等。如果指定
    x=0.3
    ,则
    x==0.3
    将为
    true
    。下面所有的否定答案都正确地警告您,程序员经常将
    double
    视为一种实数,并错误地期望在某些特定情况下从某些计算中得到特定结果,从而在代码中引入bug。(例如,如果你认为(x=0.0;x!=0.3;x+=0.1)的
    将要终止,再想想!)明智地使用
    =
    ,并使用单元测试和
    断言向其他程序员证明你知道你在做什么。如果你与
    =
    相比,你肯定会遇到问题。与
    ==
    相比,情况更糟,但仍然存在问题。此外,检查一个具体的例子