7

在方案中我可以做到:

#;> (numerator 1/3)
1
#;> (denominator 1/3)
3

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

user=> (numerator 1/3)
1
user=> (denominator 1/3)
3

但在方案中我可以做到:

#;> (numerator 0.3)
3.0

这在 Clojure 中是不可能的:

user=> (numerator 0.3)

ClassCastException java.lang.Double cannot be cast to clojure.lang.Ratio  clojure.core/numerator (core.clj:3306)

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

在 Scheme 中,我们inexact->exact在 Clojure 中也有类似“double to ratio”之类的东西,但我找不到类似的东西。

4

1 回答 1

12

哦,这个我认识!

user=> (rationalize 0.3)
3/10
user=> (numerator (rationalize 0.3))
3

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

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

在他的回答中查看他的 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
于 2014-08-08T01:48:23.040 回答