因为比率值会化简为最简形式,并且对于最低项是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?
提议: 将分子和分母扩展到也能处理整数类型(long, BigInt, BigInteger),通过将路由到为所需的类型重载的Numbers方法。
补丁: clj-1435.patch
已审核: Alex Miller
为Rich筛选的问题
- 分子和分母被标记为返回java.math.BigInteger(而不是clojure.lang.BigInt),我在补丁中遵循了这个。似乎也许应该用BigInt,不确定基于什么做出这个决定。
- 分子和分母应该接受BigInteger和BigInt吗?