Clojure中的浮点精度

Clojure中的浮点精度,clojure,floating-point,floating-accuracy,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吗?由于计算机上浮点数的表示形式,对这些数字的运算是不精确的。它同时适用于JVM和物理机器。请参阅以获得更详细的讨论。这个问题的答案中还链接了一篇综合性文章。这是由于,它影

我试图学习Clojure并尝试定义此简单函数:

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

有人能解释为什么这里的结果末尾有一个2吗?

由于计算机上浮点数的表示形式,对这些数字的运算是不精确的。它同时适用于JVM和物理机器。请参阅以获得更详细的讨论。这个问题的答案中还链接了一篇综合性文章。

这是由于,它影响到所有使用浮点表示的语言。有些值不能用浮点数精确表示

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

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

请注意,在数字常量的末尾使用“M”表示要使用高精度数字。在这种情况下,Clojure在引擎盖下使用数字。

事实上,当您使用M表示法时,您不仅可以获得高精度,还可以获得任意精度。这不仅仅是从32位跳到64位的问题。为了完整起见,它还适用于比率,例如(triple(/101 100))=>303/100。你可以在这里阅读一些关于这个问题的分析:请注意,这不是clojure特有的问题,而是计算机处理算术的一般方式之一。