这个问题与 CLJ-1036 密切相关,但有建议要创建一个新的问题。
问题在于对于浮点数 {{f}} 和双精度数 {{d}},我们可以有 {{(= f d)}} 但没有 {{(= (hash f) (hash d))}} 的现象,这破坏了哈希/等价一致性的一项基本假设,导致出现如下奇怪的情况(来自 Immo Heikkinen 发给 Clojure 邮件列表的邮件)
(= (float 0.5) (double 0.5))
=> true
(= #{(float 0.5)} #{(double 0.5)})
=> true
(= {:a (float 0.5)} {:a (double 0.5)})
=> true
(= #{{:a (float 0.5)}} #{{:a (double 0.5)}})
=> false
解决这个问题的一种方法是对浮点数和/或双精度数的哈希进行微调,但这种建议显然已被拒绝。
另一种方法是修改 {{=}},使其在浮点数/双精度数比较中永远不会返回 true。实际上,决不应该使用 {{=}} 来比较浮点数与双精度数,因此这种更改应该对恢复哈希/等价一致性的影响最小。