我很困惑于float
和double
之间的差异。我读this post。我认为这种差异只是精确的。所以我预计如果0.1 + 0.2 == 0.3
返回false
然后要么0.1f + 0.2f == 0.3f
。浮法arithemtic和双精度?
但实际上0.1f + 0.2f == 0.3f
返回true
。为什么?
这是一个纯Java问题还是什么?
我很困惑于float
和double
之间的差异。我读this post。我认为这种差异只是精确的。所以我预计如果0.1 + 0.2 == 0.3
返回false
然后要么0.1f + 0.2f == 0.3f
。浮法arithemtic和双精度?
但实际上0.1f + 0.2f == 0.3f
返回true
。为什么?
这是一个纯Java问题还是什么?
不,它只是十进制二进制转换的假象。
在引擎盖下,浮点数用二进制表示。数,为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,因此平等。
你不应该永远比浮筒或平等双打,你不能真正保证数量分配给float或double是确切
此声明*方式太强烈。在很多情况下,比较花车或双打的平等是完全合理的。 –