由于比值会化简为最简形式,对于最低项为 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 都可以?