因为比率的值会变成最简形式,并且对于最低形式是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两者?