如何在 Clojure 中将 long int 转换为有理数?
这不起作用:
user> (class (/ 5 1))
java.long.Long
如何在 Clojure 中将 long int 转换为有理数?
这不起作用:
user> (class (/ 5 1))
java.long.Long
您无需将 long显式转换为有理数。
Clojure 将转换
clojure.lang.Ratio
)变成一个长(java.lang.Long
)当它可以时:当分母是或可以被做成时1
;1
。因此
(type (/ 4 2))
; java.lang.Long
(type (/ 4 3))
; clojure.lang.Ratio
有rationalize
。但这并不能满足您的要求——如果分母为 1,它仍会返回 long。但是,如果您希望将其用于类型测试,Clojure 函数会rational?
为 long 类型返回 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)))