为什么结果不同?浮动VS双精度

2022-07-14 00:00:00 precision computer-science java
System.out.println(0.1F + 0.2F); // 0.3
System.out.println(0.1D + 0.2D); // 0.30000000000000004

我理解为0.1D+0.2D~=0.30000000000000004。
但我猜这些结果是一样的,但事实并非如此。
为什么结果不同?


解决方案

结果为何不同?

一般意义上:

  • 因为floatdouble的二进制表示形式不同。
  • 因此,十进制和二进制浮点表示之间的差异(误差)在floatdouble中可能不同。
  • 当各个数字的表示误差不同时,计算后的误差可能会有所不同。

在将十进制数转换为二进制数、进行算术运算以及将二进制数转换回十进制数以打印数字时,可能会出现错误和/或复合错误。在实际计算机上进行所有涉及实数和有限数值表示的计算时,它们都是固有的/不可避免的。

有关更广泛的治疗方法,请阅读:Is floating point math broken?


现在,如果您愿意,您可以检查这里的数字的二进制表示法,并精确地计算出这里发生错误的位置:

  • 在十进制->二进制浮点转换中
  • 在浮点运算中
  • 在二进制浮点转换->十进制转换中,
  • 或以上多个中的一个。
如果您真的想深入研究它,我建议您看看Float.floatToRawBits方法及其double模拟。这些将允许您检查二进制浮点表示。然后,您可以手动将它们转换为精确实数,并计算出与"理想"小数表示法相比的误差。

单调乏味。

相关文章