浮点运算和双精度



我对floatdouble之间的区别感到困惑。我读了这篇文章。我认为区别仅在于精度。所以我预计,如果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是:

0.100000000000000000055511151231257827021181583404541015625

所以事实证明,如果你加上最接近double 0.1 和最接近double 0.2,然后将结果四舍五入到最接近的 double ,你实际上没有得到最接近double 0.3,而是你得到它后面的那个(通常打印为 0.30000000000000004 ,但实际上有更多的数字), 因此缺乏平等。

另一方面,如果将最接近float 0.1 和最接近的 0.2 相加float,然后将该结果四舍五入到最接近的 float ,则确实得到最接近float 0.3,因此相等。

你不应该比较浮点数或双精度数的相等性,你不能真正保证你分配给浮点数或双精度数的数字是准确的

最新更新