2016-05-29 107 views
2

我很困惑于floatdouble之间的差异。我读this post。我认为这种差异只是精确的。所以我预计如果0.1 + 0.2 == 0.3返回false然后要么0.1f + 0.2f == 0.3f浮法arithemtic和双精度?

但实际上0.1f + 0.2f == 0.3f返回true。为什么?

这是一个纯Java问题还是什么?

回答

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

你不应该永远比浮筒或平等双打,你不能真正保证数量分配给float或double是确切

+4

此声明*方式太强烈。在很多情况下,比较花车或双打的平等是完全合理的。 –