为什么会有不同的结果? float vs double [duplicate]

问题描述 投票:0回答:2
System.out.println(0.1F + 0.2F); // 0.3
System.out.println(0.1D + 0.2D); // 0.30000000000000004

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

java computer-science precision
2个回答
1
投票

为什么结果不同?

一般意义上:

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

将十进制数转换为二进制数,进行算术运算以及将二进制数转换回十进制以打印出数字时,错误会蔓延和/或增加错误。对于在实际计算机上涉及实数和有限数字表示的所有计算,它们是固有的/不可避免的。

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


现在,如果您愿意的话,可以在这里检查数字的二进制表示形式,并精确地找出此处发生错误的位置:

  • 十进制->二进制浮点转换
  • 在浮点运算中
  • 在二进制浮点转换->十进制转换中,
  • 或以上中的一项。

如果您真的想深入研究它,我建议您看一下Float.floatToRawBits方法及其double模拟。这些将使您可以检查二进制浮点表示形式。然后,您可以将它们手动转换为exact实数,并与“理想”十进制表示相比,计算出错误。

这很乏味。


-1
投票

[根据我的编程经验,我经常需要决定是否对实数使用float或double。有时我会选择浮动,有时我会选择双重,但实际上这感觉更主观。如果我要捍卫自己的决定,我可能不会给出合理的理由。

[什么时候使用float,什么时候使用double?您是否总是使用double,仅当存在内存限制时才选择float?或者,除非精度要求要求您使用double,否则您始终使用float? float和double之间的基本算术计算复杂性是否有实质性差异?使用float或double的利弊是什么?而且你还用过长双吗?

© www.soinside.com 2019 - 2024. All rights reserved.