我对float
和double
之间的区别感到困惑。我看了this post。我认为差异只在于精确度。所以我希望如果0.1 + 0.2 == 0.3
返回false
,那么0.1f + 0.2f == 0.3f
也是如此。
但实际上0.1f + 0.2f == 0.3f
会返回true
。为什么?
这是纯Java问题还是什么?
答案 0 :(得分:6)
不,这只是十进制二进制转换的工件。
在引擎盖下,浮点数以二进制表示。数字0.1不能用二进制精确表示,因此需要四舍五入到最接近的可表示数字,其中float
是:
0.100000001490116119384765625
而double
是:
0.1000000000000000055511151231257827021181583404541015625
所以事实证明,如果你添加double
最近的0.1,并且double
最接近0.2,然后将结果舍入到最近的double
,你实际上并没有得到double
最接近0.3,但你得到它后面的那个(通常打印为0.30000000000000004
,但实际上有更多的数字),因此缺乏相等性。
另一方面,如果你添加float
最接近的0.1,float
最接近0.2,然后将结果舍入到最近的float
,你做得到float
最近的0.3,因此是相等的。
答案 1 :(得分:1)
你不应该比较浮点数或双精度数是否相等,你不能真正保证你赋予float或double的数字是准确的