因为比率值会简化为最简形式,而对于最低项为 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=>
`
不支持整数类型的分子和分母很令人困惑,因为这要求你总是在调用它们之前检查 ratio?。
建议: 扩展 numerator 和 denominator,使其也能在整数类型(long, BigInt, BigInteger)上工作,通过路由到 Numbers 的重载方法来实现所需类型。
补丁: clj-1435.patch
审阅者: Alex Miller
为 Rich 审阅的提问
- numerator 和 denominator 标记为返回 java.math.BigInteger(而不是 clojure.lang.BigInt),并且我在补丁中遵循了这一点。看起来可能应该是 BigInt 吧?不确定如何做出这个决定。
- numerator 和 denominator 是否应该接受 BigInteger 和 BigInt 都可以?