如何在 Clojure 中将长 int 转换为有理数?
这不起作用:
user> (class (/ 5 1))
java.long.Long
你不需要显式地将长整型转换为有理数。
克洛朱尔将转换
- 一个有理数(
clojure.lang.Ratio
(变成一个长(java.lang.Long
(,当它可以:当分母是或可以被制造为1
时; - longs或其他ints在必须时进入有理数:当除法不能解析为
1
的分母时。
因此
(type (/ 4 2))
; java.lang.Long
(type (/ 4 3))
; clojure.lang.Ratio
有rationalize
.但这并不能满足您的要求 - 如果分母为 1,它仍然返回 long。但是,如果您希望将其用于类型测试目的,则 Clojure 函数rational?
返回 true 表示长整型。
如果你真的想要 Ratio 类型,我认为你必须自己编写,因为rationalize
源代码会立即潜入底层 Java。
(clojure.lang.Ratio.
(. BigInteger (valueOf 3))
(. BigInteger (valueOf 1)))
; 3/1
也许:
(defn myrationalize
[num]
(if (integer? num)
(clojure.lang.Ratio.
(. BigInteger (valueOf num))
(. BigInteger (valueOf 1)))
(rationalize num)))