双常量的比较

Comparison of Double Constants

我对此进行了很多研究,我对双打的精度误差有所了解;但是我找不到答案。我的问题是:比较双精度常量 总是 安全吗?我的意思是,只是从字符串中读取双精度值或在源代码中创建。不会对它们进行任何操作(加、减等)。如果我创建一个像

这样的变量

双 c = 3.0.

下面的等式是否永远成立? c==3.0000.

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

For example is there any possibility to see wrong evaluation of an equation like this 1.23456789 < 1.23456788?

是的,这是可能的,因为您可以编写具有任意位数的浮点文字,并且当它们被编译器解释时,这些将被近似为适合 double 的最接近的值.

例如:

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

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

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

总是安全的;有一个警告。

这是一个例子:

1.232342134214321412421 == 1.232342134214321412422

正确;所有 double 常量都默默地四舍五入到最接近的可表示双精度,并且对于这两个数字,它是相同的双精度。

因此,给定 2 个实际的数学数字 A 和 B,其中 A < B,然后如果将这些数字转换为双精度文字并 运行 这 3 个表达式,您将得到以下场景:

如果 A 和 B 舍入为不同的双精度值,您将得到保证:

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

如果 A 和 B 真的很接近,他们可能会四舍五入到相同的两倍,你会得到:

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

换句话说,'less than' 和 'greater than' 可以弯曲成相等,但较小的数字永远不会被错误地视为较大。