7

スキームでは、次のことができます。

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

Clojure では、次のようなことができます。

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

しかし、Scheme では次のことができます。

#;> (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 に変換するにはどうすればよいですか?

スキームには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 に答える