我对float
和double
之间的区别感到困惑。我读了这篇文章。我认为区别仅在于精度。所以我预计,如果0.1 + 0.2 == 0.3
返回false
那么要么0.1f + 0.2f == 0.3f
.
但实际上0.1f + 0.2f == 0.3f
回报true
.为什么呢?
这是一个纯粹的Java问题还是什么?
不,它只是十进制二进制转换的工件。
在引擎盖下,浮点数以二进制表示。数字 0.1 不能完全用二进制表示,因此需要将其四舍五入到最接近的可表示数字,其中float
为:
0.100000001490116119384765625
double
是:
所以事实证明,如果你加上最接近double
0.1 和最接近double
0.2,然后将结果四舍五入到最接近的 double
,你实际上没有得到最接近double
0.3,而是你得到它后面的那个(通常打印为 0.30000000000000004
,但实际上有更多的数字), 因此缺乏平等。
另一方面,如果将最接近float
0.1 和最接近的 0.2 相加float
,然后将该结果四舍五入到最接近的 float
,则确实得到最接近float
0.3,因此相等。
你不应该比较浮点数或双精度数的相等性,你不能真正保证你分配给浮点数或双精度数的数字是准确的