我想检查double
是否小于,等于或大于另一个double
。即使我读了很多关于floats
和doubles
由于计算机如何在二进制级别计算而无法精确比较,但使用简单的二元运算符到目前为止就像魅力一样。我用几十个不同的数字对它进行了测试,到目前为止,它还没有让我失望过。
那么在我的情况下比较它们真的有问题吗?如果有 - 为什么我找不到它以及如何解决它?
编辑:如果我决定比较它们,我知道0.1 + 0.2 != 0.3
。问题是 - 我想简单地比较两个固定 doubles
。我不必比较0.1 + 0.2
和0.3
。我必须充分比较0.3
和0.3
。或0.4
和0.3
。这样的事情。我真的需要使用BigDecimal,epsilon或其他什么吗?
答案 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
的 具有可比性。出现问题主要是由于两个原因
double
的数学与Reals的数学相同。它不是。关于什么事情应该完全平等的许多假设不容易(或者根本)从Reals转换为double
。strictfp
)像往常一样,其他答案都是错误的。 double
并不“代表”一系列数字(你可以假装它们,但最终double
只有一个确切的值,而不是它代表什么样的“范围”的概念)。答案显示double
的平等可以有“有趣的结果”是正确的,因为结果是“有趣的”,但问题出在预期结果,而不是结果本身。如果你期望正确的话,那就没问题了。