这个问题与 问题 1555 有关,但涉及的类型不同,因此潜在的问题可能也不同。
在 bigint 与 float 之间,`rem` 返回的结果看起来非常不正确。注意使用 10000
作为除数与使用 1e4
的极大差异
user> (rem 9037601485536036300227801N 10000)
7801N
user> (long (rem 9037601485536036300227801N 1e4))
1073741824
test.check
提供了更清晰的、明显不正确的结果示例
user> (rem 9007199254740993N 2)
1N
user> (rem 9007199254740993N 2.0)
0.0
下面是一个生成测试用例以重现这个结果
(clojure.test.check/quick-check
100 (prop/for-all [l gen/size-bounded-bigint
r (gen/fmap inc gen/nat)]
(== (rem l (double r))
(rem l (long r)))))