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

如何在clojure中比较不同的数字类型,clojure,bigdecimal,Clojure,Bigdecimal,这里是Clojure新手。使用clojure 1.4.0 REPL (== 2 2.0) ; true (== 2.0 2.0M) ; true (== 2 2.0M) ; false 这不是违反逻辑吗?如果前两个是真的,那么第三个不是也应该是真的吗?==是独立于类型的,请尝试以下操作: user=> (== (bigdec 2.0) 2.0M) true user=> (type (bigdec 2.0)) java.math.BigDec

这里是Clojure新手。使用clojure 1.4.0 REPL

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

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

==
是独立于类型的,请尝试以下操作:

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

只有当大小数的值和小数位数相同时,才认为它们相等。在这种情况下,一个大小数的有效位数比另一个大小数的有效位数多:

user> (== 2 (. 2.0M stripTrailingZeros))
true
user> (== 2 2.0M )
false
甚至在大小数之间也会出现一个更荒谬的例子:

user> (== 0.000000M 0.0M)
false

我个人认为这在数学意义上是“错误的”,我已经开始考虑是否有兴趣改变这一点

我建议查看如何在java中比较BigDecimal和int。这些答案在这里是适用的,因为这基本上就是你正在做的。==应该独立地比较'nums'类型也应该如此,但它似乎不是那样的。你的想法是正确的。。。几乎。。。我觉得有点不舒服。BigDecimal的相等语义不是Clojure决策,因此如果您想很好地使用主机平台,这种情况就会发生:-/在当前时间和版本中,
(==0.000000M 0.0M)
会产生true,而不是false。