因为比例值会简化为最简形式,并且在最低形式为 N/1 的整数值中,会自动转换为大整数(以前是 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 吗?