Clojure中的浮点精度

use*_*851 2 floating-point clojure floating-accuracy

我正在尝试学习Clojure并尝试定义这个简单的函数:

user=> (defn triple [arg] (* 3 arg))
#'user/triple
user=> (triple 1)
3
user=> (triple 1.01)
3.0300000000000002
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么在这里结果有2?

Jan*_*Jan 12

由于计算机上浮点数的表示,对这些数字的操作并不精确.它适用于JVM和物理机.有关详细讨论,请参阅浮点不准确示例.还有一篇全面的文章,每个计算机科学家应该知道的关于浮点算术的内容与该问题的答案相关联.


mik*_*era 6

这是由于浮点不准确,这会影响具有浮点表示的所有语言.有些值无法用浮点数精确表示.

幸运的是,Clojure还支持高精度数字,因此您可以:

(defn triple [arg] (* 3 arg))
(triple 1.01M)
=> 3.03M
Run Code Online (Sandbox Code Playgroud)

请注意,在数字常量的末尾使用"M"表示您要使用高精度数字.在这种情况下,Clojure使用java.math.BigDecimal数字.