JVM 上的 Clojure 如何将浮点数转换为带有尾随垃圾数字的双精度数?

How does Clojure on the JVM convert from a float to a double with trailing garbage digits?

我运行:

(double (float 3.14159))

我得到:

3.141590118408203

如果我运行它下降到:

(double (float 3.141))

我得到: 3.1410000324249268

这种转换是通过什么方法发生的?

这与浮点运算的一般精度问题有关;计算机上的浮点数 不直接映射到十进制数 ,因此浮点数和双精度数的标准十进制显示是四舍五入的。换一种说法;这里的 float 和 double 具有完全相同的值,但显示时它们的舍入不同。

=> (= (double (float 3.14159)) (float 3.14159))
true

在 JVM 上,Why converting from float to double changes the value? and Convert float to double without losing precision 可能会有帮助。