将两个固定双打与<,=,>进行比较。真的有问题吗?

时间:2015-04-10 13:41:09

标签: java numbers compare theory point

我想检查double是否小于,等于或大于另一个double。即使我读了很多关于floatsdoubles由于计算机如何在二进制级别计算而无法精确比较,但使用简单的二元运算符到目前为止就像魅力一样。我用几十个不同的数字对它进行了测试,到目前为止,它还没有让我失望过。

那么在我的情况下比较它们真的有问题吗?如果有 - 为什么我找不到它以及如何解决它?

编辑:如果我决定比较它们,我知道0.1 + 0.2 != 0.3。问题是 - 我想简单地比较两个固定 doubles。我不必比较0.1 + 0.20.3。我必须充分比较0.30.3。或0.40.3。这样的事情。我真的需要使用BigDecimal,epsilon或其他什么吗?

4 个答案:

答案 0 :(得分:2)

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

例如,double无法准确地表示一些非常大的数字,在这种情况下,它们会被“舍入”#34;到最近的双倍。例如见:

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
}

答案 1 :(得分:1)

以下是使用float时可能导致错误的示例。

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

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

答案 2 :(得分:1)

<>运算符不是问题。

==运算符会导致任何实际数据出现问题。所以你还没有遇到问题?好吧,你可以在雷雨期间在高尔夫球场上跑来跑去,挥舞着你的头上的球杆,也不会被闪电击中。并不意味着你不会。

答案 3 :(得分:0)

double 具有可比性。出现问题主要是由于两个原因

  1. 很多人都认为double的数学与Reals的数学相同。它不是。关于什么事情应该完全平等的许多假设不容易(或者根本)从Reals转换为double
  2. “有趣的东西”,例如Extended Precision激活不可预测(使用strictfp
  3. 像往常一样,其他答案都是错误的。 double并不“代表”一系列数字(你可以假装它们,但最终double只有一个确切的值,而不是它代表什么样的“范围”的概念)。答案显示double的平等可以有“有趣的结果”是正确的,因为结果是“有趣的”,但问题出在预期结果,而不是结果本身。如果你期望正确的话,那就没问题了。