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/