我对此进行了大量研究,对双打中的精度误差有所了解;但是我找不到答案。我的问题是:比较双常数总是安全吗?我的意思是,只是从字符串中读取double或在源代码中创建。不会对它们进行任何运算(加法、减法等(。如果我创建一个像这样的变量
二重c=3.0。
下面的等式会一直成立吗?c==3.000。
例如,是否有可能看到这样的方程的错误评估1.23456789<1.234566788?
它总是安全的;有一点需要注意。
这里有一个例子:
1.232342134214321412421 == 1.232342134214321412422
这是真;所有的double常数都被静默地四舍五入到最接近的可表示的double,对于这两个数字,它都是同一个double。
因此,给定两个实际的数学数字A和B,其中A < B
,如果你把这些数字变成双文本,并在上面运行这3个表达式,你会得到以下场景:
如果A和B四舍五入到不同的双打,则可以得到保证:
A < B
将为真A == B
将为falseA > B
将为false
如果A和B真的很接近,它们可能会四舍五入到同一个二重,你会得到:
A < B
将为falseA == B
将为真A > B
将为false
换句话说,"小于"one_answers"大于"可以弯曲为相等,但较小的数字永远不会被错误地视为较大。
例如,是否有可能看到对这样的方程的错误评估1.23456789<1.234566788?
是的,这是可能的,因为您可以编写具有任意数字的浮点文字,当编译器对其进行解释时,这些数字将近似为double
中最接近的值。
例如:
boolean result = 1.2003004005006007008009 > 1.2003004005006007008008;
System.out.println(result);
打印false
,即使在数学上第一个数字大于第二个数字(所以您希望它打印true
(。
总之:通过使用浮点文字值,您不会突然拥有任意精度的浮点数。