如何将任何数字转换为Clojure中的clojure.lang.Ratio类型?

Fel*_*ipe 6 math clojure rational-numbers inexact-arithmetic

在Scheme中我可以做到:

#;> (numerator 1/3)
1
#;> (denominator 1/3)
3
Run Code Online (Sandbox Code Playgroud)

在Clojure中我可以做类似的事情:

user=> (numerator 1/3)
1
user=> (denominator 1/3)
3
Run Code Online (Sandbox Code Playgroud)

但在Scheme中我可以这样做:

#;> (numerator 0.3)
3.0
Run Code Online (Sandbox Code Playgroud)

在Clojure中是不可能的:

user=> (numerator 0.3)

ClassCastException java.lang.Double cannot be cast to clojure.lang.Ratio  clojure.core/numerator (core.clj:3306)
Run Code Online (Sandbox Code Playgroud)

如何将Double(或实际上任何类型的数字)转换为clojure.lang.Ratio?

在Scheme中我们还有inexact->exactClojure中的"double to ratio",但我找不到类似的东西.

Yos*_*ark 10

哦,我知道这一个!

user=> (rationalize 0.3)
3/10
user=> (numerator (rationalize 0.3))
3
Run Code Online (Sandbox Code Playgroud)

但OP指出这不适用于所有数字:

user=> (numerator (rationalize 1))
ClassCastException java.lang.Long cannot be cast to clojure.lang.Ratio  clojure.core/numerator (core.clj:3306)
Run Code Online (Sandbox Code Playgroud)

在他的回答中看到他的Java互操作解决方法.


[编辑] OP在这里:

这是一个更通用的解决方案:

user=> (numerator (clojure.lang.Numbers/toRatio (rationalize 1)))
1
user=> (numerator (clojure.lang.Numbers/toRatio (rationalize 0.3)))
3
user=> (numerator (clojure.lang.Numbers/toRatio (rationalize 1/3)))
1
Run Code Online (Sandbox Code Playgroud)

  • `(理性?3)`返回`true`,但`(分子3)`爆炸.不可能是对的. (4认同)
  • @Rich Hickey在哪里?:) (2认同)