java - 为什么 Math.floor(1.23456789 * 1e8)/1e8) 返回 1.23456788

标签 java decimalformat

Math.floor(1.23456789 * 1e8) / 1e8)

返回:

1.23456788

考虑到这一点,这很奇怪:

Math.floor(1.23456789 * 1e9) / 1e9)

返回:

1.23456789

还有

Math.floor(1.23456799 * 1e8) / 1e8)

返回:

1.23456799

知道为什么会发生这种情况以及如何避免它吗?

最佳答案

正如 Daniel Centore 所回答的那样, double 值是不精确的。以下是 double 字的实际值(最多 20 位)的列表。显示的是 1.23456789 的两个最接近的编码;第一个更接近。乘以 1e8 时,乘法不会向上舍入。当乘以 1e9 时,乘法向上舍入为精确的整数值。

1.23456789     => 1.2345678899999998901 hex 3ff3c0ca4283de1b
1.23456789     => 1.2345678900000001121 hex 3ff3c0ca4283de1c
1.23456789*1e8 => 123456788.99999998510 hex 419d6f3453ffffff
1.23456789*1e9 => 1234567890.0000000000 hex 41d26580b4800000

关于java - 为什么 Math.floor(1.23456789 * 1e8)/1e8) 返回 1.23456788,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43880894/

相关文章:

java - Jtree 和组合框布局

Java DecimalFormat 在强制执行指数符号时会产生错误

java - 如何对方法的结果施加 decimalFormat?

android - 在 EditText 上显示非常大的 double 值

java - 十进制格式类问题

c# - 如何从 XobotOS 构建/使用锐化?

java - 用于合理处理 UTC 中的 DATETIME 和 TIMESTAMP 的 JDBC-mysql 驱动程序设置是什么?

java - 我如何使用带有 json 参数的curl 调用Web 服务?

java - 在 Android ArrayList 上存储路径对象中的点

java - 如何在Java中用十进制格式表示 "1.275"到 "1.28"