为什么结果不同?浮动与双
Why different result? float vs double
System.out.println(0.1F + 0.2F); // 0.3
System.out.println(0.1D + 0.2D); // 0.30000000000000004
我理解 0.1D + 0.2D ~= 0.30000000000000004.
但我猜这些结果是相同的,但事实并非如此。
为什么结果不同?
为什么结果不同?
一般意义上:
- 因为
float
和 double
的二进制表示不同。
- 因此,十进制和二进制浮点表示之间的差异(错误)在
float
和 double
中可能会有所不同。
- 当各个数字的表示误差不同时,计算后的误差容易不同
在将十进制数转换为二进制、进行算术运算以及将二进制转换回十进制以打印出数字时,and/or 化合物中可能会出现错误。对于实际计算机上涉及实数和有限数值表示的所有计算,它们是固有的/不可避免的。
有关更广泛的处理,请阅读:Is floating point math broken?
现在,如果您愿意,可以检查此处数字的二进制表示,并准确计算出此处发生错误的位置:
- 十进制->二进制浮点数转换
- 在浮点运算中
- 在二进制浮点数转换->十进制转换中,
- 或以上一项以上。
如果你真的想深入研究它,我建议你看一下 Float.floatToRawBits
方法及其 double
模拟。这些将允许您检查二进制浮点表示。然后,您可以手动将它们转换为 精确 实数,并计算出与 "ideal" 十进制表示法相比的误差。
很乏味。
System.out.println(0.1F + 0.2F); // 0.3
System.out.println(0.1D + 0.2D); // 0.30000000000000004
我理解 0.1D + 0.2D ~= 0.30000000000000004.
但我猜这些结果是相同的,但事实并非如此。
为什么结果不同?
为什么结果不同?
一般意义上:
- 因为
float
和double
的二进制表示不同。 - 因此,十进制和二进制浮点表示之间的差异(错误)在
float
和double
中可能会有所不同。 - 当各个数字的表示误差不同时,计算后的误差容易不同
在将十进制数转换为二进制、进行算术运算以及将二进制转换回十进制以打印出数字时,and/or 化合物中可能会出现错误。对于实际计算机上涉及实数和有限数值表示的所有计算,它们是固有的/不可避免的。
有关更广泛的处理,请阅读:Is floating point math broken?
现在,如果您愿意,可以检查此处数字的二进制表示,并准确计算出此处发生错误的位置:
- 十进制->二进制浮点数转换
- 在浮点运算中
- 在二进制浮点数转换->十进制转换中,
- 或以上一项以上。
如果你真的想深入研究它,我建议你看一下 Float.floatToRawBits
方法及其 double
模拟。这些将允许您检查二进制浮点表示。然后,您可以手动将它们转换为 精确 实数,并计算出与 "ideal" 十进制表示法相比的误差。
很乏味。