Elixirには、整数と小数という2種類の数値があります。
小数は、小数点以下の桁を1つ以上持つ数値です。64ビットの倍精度浮動小数点形式を使います。
float = 3.45
# => 3.45
Elixirは、小数の指数表記にも対応しています。
1.25e-2
# => 0.0125
小数は、丸め誤差が起こりやすいことで知られています。
0.1 + 0.2
# => 0.30000000000000004
しかし、こうした誤差はElixirに限ったものではありません。どのプログラミング言語でも起こります。これは、コンピューター上のすべてのデータが2進数として保存・処理されているためです。2進数では、分母が2^nで表せる分数(たとえば1/4、3/8、5/16)だけが正確に表せます。それ以外の分数は近似値として表されます。
# 3/4
Float.ratio(0.75)
# => {3, 4}
# 3/5
Float.ratio(0.6)
# => {5404319552844595, 9007199254740992}
この問題について詳しくは、0.30000000000000004.comで学べます。Float Toyのページには、浮動小数点数のビットが実際の浮動小数点値にどう変換されるかを、図でわかりやすく説明してくれています。
整数と小数は、値が同じであれば等しいとみなせます(==)。ただし、型が異なるため、厳密には決して等しくなりません(===)。
1 == 1.0
# => true
1 === 1.0
# => false
整数と小数は、1つの算術式の中で混ぜて使えます。式の中で小数を使うと、結果も必ず小数になります。
2 * 3
# => 6
2 * 3.0
# => 6.0
小数は、丸める(round)、切り上げる(ceil)、切り捨てる(floor)ことができます。
小数を丸めた結果を小数として得るには、Floatモジュールの関数(Float.round、Float.ceil、Float.floor)を使います。代わりに整数を得たいときは、Kernelモジュールの関数(round、ceil、floor)を使います。
小数を整数に変えるもう1つの方法は、truncで小数部分を切り捨てることです。
Float.ceil(5.2)
# => 6.0
ceil(5.2)
# => 6
trunc(5.2)
# => 5