因为比值可以化简为最简形式,对于最低项是 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)上工作,通过路由到 Number 期望类型的重载方法来实现。
补丁: clj-1435.patch
已筛选: Alex Miller
为 Rich 筛选的问题
- 分子和分母被标记为返回 java.math.BigInteger(而非 clojure.lang.BigInt),并且我在补丁中遵循了这一点。但也许应该是 BigInt?不确定基于什么做出这个决定。
- 分子和分母应该接受 BigInteger 和 BigInt 两者吗?