Clojure では分数を扱う Ratio 型がある。
とりあえず見てみる
user=> (/ 22 7) 22/7 user=> (class (/ 22 7)) clojure.lang.Ratio
型変換
Integer や Float にいつでも変換できる。
user=> (int (/ 22 7)) 3 user=> (float (/ 22 7)) 3.142857
有理数化
rationalize
は面白い。引数を有理数に変換するのだが、返り値は様々。
user=> (rationalize 1.5) 3/2 user=> (class (rationalize 1.5)) clojure.lang.Ratio user=> (rationalize 1N) 1N user=> (class (rationalize 1N)) clojure.lang.BigInt user=> (rationalize 1.00) 1N user=> (class (rationalize 1.00)) clojure.lang.BigInt user=> (rationalize 1) 1 user=> (class (rationalize 1)) java.lang.Long user=> (rationalize 4/2) 2 user=> (class (rationalize 4/2)) java.lang.Long
test
test する関数は ratio?
と rational?
がある。
user=> (doc ratio?) ------------------------- clojure.core/ratio? ([n]) Returns true if n is a Ratio ;; 型が Ratio のときのみ true user=> (ratio? 4/3) ;; Ratio true user=> (ratio? 4/2) ;; これは Long false user=> (ratio? 2) ;; Long false user=> (ratio? 2.0) ;; Double false
user=> (doc rational?) ------------------------- clojure.core/rational? ([n]) Returns true if n is a rational number ;; 有理数であれば true なので整数(Long)にも true を返す user=> (rational? 4/3) true user=> (rational? 4/2) true user=> (rational? 2) true user=> (rational? 2.0) false