这与CLJ-1036密切相关,但有人建议创建一个新的工单。
问题在于对于一个浮点数{{f}}和一个double{{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。无论如何都应避免使用{{=}}比较浮点数和双精度浮点数,因此这种更改应具有良好的影响,恢复哈希/相等性一致性。