如何在clojure中比较不同的数字类型

时间:2012-11-30 02:38:07

标签: clojure bigdecimal

Clojure新手在这里。使用clojure 1.4.0 REPL;

(== 2    2.0)      ; true
(== 2.0  2.0M)     ; true
(== 2    2.0M)     ; false

这不是逻辑违规吗?如果前两个是真的,那么第三个也不是真的吗?

2 个答案:

答案 0 :(得分:1)

==type-independent,请尝试以下操作:

user=> (== (bigdec 2.0) 2.0M)
true
user=> (type (bigdec 2.0))
java.math.BigDecimal
user=> (type 2.0M)
java.math.BigDecimal

答案 1 :(得分:1)

bigDecimals只有在值和比例中相同时才被认为是相同的在这种情况下,其中一个比另一个有更多有效数字:

user> (== 2 (. 2.0M stripTrailingZeros))
true
user> (== 2 2.0M )
false

即使在bigdecimals之间也会出现一个更荒谬的例子:

user> (== 0.000000M 0.0M)
false

我个人认为这在数学意义上是“错误的”并打开this bug以确定是否有兴趣改变它。