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->exact
Clojure中的"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)