浮动arithemtic和双精度?

时间:2016-05-29 06:34:16

标签: java floating-point language-agnostic

我对floatdouble之间的区别感到困惑。我看了this post。我认为差异只在于精确度。所以我希望如果0.1 + 0.2 == 0.3返回false,那么0.1f + 0.2f == 0.3f也是如此。

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

这是纯Java问题还是什么?

2 个答案:

答案 0 :(得分: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 :(得分:1)

你不应该比较浮点数或双精度数是否相等,你不能真正保证你赋予float或double的数字是准确的