因为比例值会化简到最简形式,且对于在最低项为 N/1 的整数值,它们将自动转换为 BigInt(以前是 Long),因此当前 {{clojure.core/numerator}} 和 {{clojure.core/denominator}} 的行为会导致意外结果。
`
user=> (numerator 1/3)
1
user=> (numerator (+ 1/3 2/3))
ClassCastException clojure.lang.BigInt 不能转换为 clojure.lang.Ratio clojure.core/numerator (core.clj:3306)
user=> (denominator 1/3)
3
user=> (denominator (+ 1/3 2/3))
ClassCastException clojure.lang.BigInt 不能转换为 clojure.lang.Ratio clojure.core/denominator (core.clj:3314)
user=>
`
不支持整数类型(如 int)上的分子和分母,这会使您在调用之前必须始终检查 ratio?,这可能会令人困惑。
建议: 将分子和分母扩展到也支持整数类型(long,BigInt,BigInteger),通过路由到 Numbers 的重载方法为所需的类型。
补丁: clj-1435.patch
审查: Alex Miller
Rich 的审查问题
- 分子和分母被标记为返回 java.math.BigInteger(而不是 clojure.lang.BigInt),这就是我在补丁中遵循的内容。但也许应该是 BigInt?我不确定基于什么做出这个决定。
- 分子和分母是否应该同时接受 BigInteger 和 BigInt?