我正在尝试学习Clojure并尝试定义这个简单的函数:
user=> (defn triple [arg] (* 3 arg))
#'user/triple
user=> (triple 1)
3
user=> (triple 1.01)
3.0300000000000002
有人可以解释为什么结果在结尾有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个数字。