浮点运算和双精度?
Float arithemtic and double precision?
我对 float
和 double
之间的区别感到困惑。我读 this post。我认为区别只是精度。所以我预计如果 0.1 + 0.2 == 0.3
returns false
那么两者都会 0.1f + 0.2f == 0.3f
。
但实际上0.1f + 0.2f == 0.3f
returnstrue
。为什么?
这是纯粹的 Java 问题还是什么?
你不应该比较浮点数或双精度数是否相等,你不能真正保证你分配给浮点数或双精度数的数字是准确的
不,这只是十进制-二进制转换的产物。
在幕后,浮点数以二进制表示。数字0.1不能用二进制精确表示,所以需要四舍五入到最接近的可表示数,其中float
为:
0.100000001490116119384765625
而 double
是:
0.1000000000000000055511151231257827021181583404541015625
所以事实证明,如果您将 double
最接近的 0.1 和 double
最接近的 0.2 相加,然后将结果四舍五入到最接近的 double
,您实际上并没有得到最接近 0.3 的 double
,但你得到的是它后面的那个(通常打印为 0.30000000000000004
,但实际上有更多的数字),因此不相等。
另一方面,如果将 float
最接近的 0.1 和 float
最接近的 0.2 相加,然后将结果四舍五入到最接近的 float
,则 do 得到最接近的 float
0.3,因此相等。
我对 float
和 double
之间的区别感到困惑。我读 this post。我认为区别只是精度。所以我预计如果 0.1 + 0.2 == 0.3
returns false
那么两者都会 0.1f + 0.2f == 0.3f
。
但实际上0.1f + 0.2f == 0.3f
returnstrue
。为什么?
这是纯粹的 Java 问题还是什么?
你不应该比较浮点数或双精度数是否相等,你不能真正保证你分配给浮点数或双精度数的数字是准确的
不,这只是十进制-二进制转换的产物。
在幕后,浮点数以二进制表示。数字0.1不能用二进制精确表示,所以需要四舍五入到最接近的可表示数,其中float
为:
0.100000001490116119384765625
而 double
是:
0.1000000000000000055511151231257827021181583404541015625
所以事实证明,如果您将 double
最接近的 0.1 和 double
最接近的 0.2 相加,然后将结果四舍五入到最接近的 double
,您实际上并没有得到最接近 0.3 的 double
,但你得到的是它后面的那个(通常打印为 0.30000000000000004
,但实际上有更多的数字),因此不相等。
另一方面,如果将 float
最接近的 0.1 和 float
最接近的 0.2 相加,然后将结果四舍五入到最接近的 float
,则 do 得到最接近的 float
0.3,因此相等。