Clojure中的浮点精度

时间:2012-02-29 12:00:37

标签: clojure floating-point floating-accuracy

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

user=> (defn triple [arg] (* 3 arg))
#'user/triple
user=> (triple 1)
3
user=> (triple 1.01)
3.0300000000000002

有人可以解释为什么结果在结尾有2吗?

2 个答案:

答案 0 :(得分:12)

由于计算机上浮点数的表示,对这些数字的操作并不精确。它适用于JVM和物理机。有关详细讨论,请参阅Floating point inaccuracy examples。在该问题的答案中还有一篇全面的文章What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:6)

这是由于floating point inaccuracy,它影响所有具有浮点表示的语言。有些值无法用浮点数精确表示。

幸运的是,Clojure也支持高精度数字,所以你可以这样做:

(defn triple [arg] (* 3 arg))
(triple 1.01M)
=> 3.03M

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