1

如何在 Clojure 中将 long int 转换为有理数?

这不起作用:

user> (class (/ 5 1))
java.long.Long
4

2 回答 2

5

您无需将 long显式转换为有理数。

Clojure 将转换

  • 一个有理数(clojure.lang.Ratio)变成一个长(java.lang.Long)当它可以时:当分母是或可以被做成时1
  • longs 或其他 int必须转换为有理数时:当除法无法解析为分母时1

因此

(type (/ 4 2)) ; java.lang.Long

(type (/ 4 3)) ; clojure.lang.Ratio

于 2014-04-29T13:29:28.100 回答
3

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)))
于 2014-04-29T14:02:06.563 回答