java - 浮点运算和 double ?

标签 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 问题还是什么?

最佳答案

不,这只是十进制到二进制转换的产物。

在底层, float 以二进制表示。数字0.1无法用二进制精确表示,因此需要四舍五入到最接近的可表示数字,其中float为:

0.100000001490116119384765625

double是:

0.1000000000000000055511151231257827021181583404541015625

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

另一方面,如果将最接近 0.1 的 float 和最接近 0.2 的 float 相加,则将结果舍入为最接近的 float,您确实得到了最接近0.3的 float ,因此相等。

关于java - 浮点运算和 double ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37506969/

相关文章:

python - 尝试使用 python boto 库插入 float 时出现 DynamoDBNumberError

string - Code Golf : "Color highlighting" of repeated text

language-agnostic - "program to an interface"是什么意思?

java - 如何远程检索 java 线程转储

java - 如何使用 Java 将字符串日期和字符串时间组合成单个即时日期时间?

ios - #Define 和 Float 之间的区别?

c++ - float 按位操作

unit-testing - 测试代码的理想时间范围是多少

java - 使用 DefaultListCellRenderer 将图标渲染到 JList 的右侧

java - 当我将它传递给 asyncTask 时,Android Location 对象返回 null