Как преобразовать любое число в тип clojure.lang.Ratio в Clojure?

На схеме я могу сделать:

#;> (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?

На схеме у нас также есть inexact->exact что-то вроде "двойное отношение" в Clojure, но я не могу найти ничего похожего на это.

1 ответ

Решение

О, я знаю это!

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

Но ОП указывает, что это работает не для всех номеров:

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

см. его обходной путь взаимодействия Java в его ответе.


[править] ОП здесь:

Вот более общее решение:

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
Другие вопросы по тегам