Как преобразовать любое число в тип 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