双常数的比较



我对此进行了大量研究,对双打中的精度误差有所了解;但是我找不到答案。我的问题是:比较双常数总是安全吗?我的意思是,只是从字符串中读取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将为false
  • A > B将为false

如果A和B真的很接近,它们可能会四舍五入到同一个二重,你会得到:

  • A < B将为false
  • A == B将为真
  • A > B将为false

换句话说,"小于"one_answers"大于"可以弯曲为相等,但较小的数字永远不会被错误地视为较大。

例如,是否有可能看到对这样的方程的错误评估1.23456789<1.234566788?

是的,这是可能的,因为您可以编写具有任意数字的浮点文字,当编译器对其进行解释时,这些数字将近似为double中最接近的值。

例如:

boolean result = 1.2003004005006007008009 > 1.2003004005006007008008;
System.out.println(result);

打印false,即使在数学上第一个数字大于第二个数字(所以您希望它打印true(。

总之:通过使用浮点文字值,您不会突然拥有任意精度的浮点数。

最新更新