我正在研究一段代码,其中数字相等是几个逻辑条件中的一个重要因素.Clojure正在做一些我不太了解的事情.例如:
user=> (- 5 4.9) 0.09999999999999964 user=> (- 5 4.8) 0.20000000000000018 user=> (- 5 2.9) 2.1 user=> (- 5 2.7) 2.3 user=> (- 5 2.8) 2.2 user=> (- 9 6.9) 2.0999999999999996 user=> (- 9 2.9) 6.1
在某些情况下,Clojure数字似乎将减法理解为0.1,而在其他情况下则不然.这里发生了什么?
默认情况下,这些结果表示为小数,具有固有的舍入误差.您可以通过后缀字母M切换到使用BigDecimals:
user=> (- 5M 4.9M) 0.1M user=> (- 5M 4.8M) 0.2M user=> (- 9M 6.9M) 2.1M user=> (- 9M 2.9M) 6.1M
要对十进制变量执行相同操作,请使用bigdec形式:
user=> (def k 4.9) #'user/k user=> (- 5M k) 0.09999999999999964 user=> (- 5M (bigdec k)) 0.1M