在Clojure中,如何将long int转换为rational?

时间:2014-04-29 12:46:58

标签: clojure rational-number

如何在Clojure中将long int转换为Rational?

这不起作用:

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

2 个答案:

答案 0 :(得分:5)

您不需要明确地将长期转化为理性。

Clojure将转换

  • 理性(clojure.lang.Ratio)成长(java.lang.Long)当可以时:分母是或可以成为1;
  • 必须时,
  • 长期或其他注入理性:当一个分裂无法解析为1的分母时。

因此

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

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

答案 1 :(得分:3)

rationalize。但这并不能达到你想要的效果 - 如果分母为1,它仍会返回long。但是,如果你想将它用于类型测试目的,那么Clojure函数rational?对于long来说将返回true。

如果您真的想要比率类型,我认为您必须自己编写,因为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)))