pryで遊んでいたときの個人的なメモです。 分かっている方には「そりゃそうだ」という話かもしれません。 おそらくプログラミングに共通する「前提知識」みたいなものが、 僕自身から欠落しているからこのような疑問を抱くんだろうな、と考えた次第です。

1
2
3
4
5
6
[18] pry(main)> 10.9999999999999991118215802.to_i
=> 10
[19] pry(main)> 10.9999999999999991118215803.to_i
=> 11
[20] pry(main)> '10.9999999999999991118215803'.to_i
=> 10

上記は切り捨てを期待したものです。 しかし小数点以下の値がある点を越えた場合にFloat#to_iは(切り捨てを行わない、という意味においては)期待はずれの挙動が見られました。 切り捨てたいならFloat#truncateとか使えばいいんだろうな。

1
2
3
4
[29] pry(main)> 10.9999999999999991118215802.truncate
=> 10
[30] pry(main)> 10.9999999999999991118215803.truncate
=> 11

上記実行の結果から以下のことが言えるのかなと考えました。 ・切り捨てたい場合には、小数点以下有効桁数を設定する