Cherry本勉強中 8月22日
cherry本学習
to_◯メソッド
to_i => 文字列を数値に変換
to_f => 文字列を小数に変換
小数だとメソッド変わることを初めて知りました。
to_s => 数値を文字列に変換する
丸め誤差注意
- 丸め誤差
=> コンピュータ内が10進数ではなく、2進数で計算するために生じる誤差でこれによってバグが生じる可能性がある
=>この本を読んだ時は最初、小数点のもの全てがこのバグを生じるのかなと思いましたが、そういうわけでもないようです。コンソールを使って確認してみました。(この後記載するrを使用してますが比較のために載せているので、スルーしてください)
puts 0.1r * 3.0r #3/10 puts 0.1 * 3.0 #0.30000000000000004 puts 0.1r * 3.0r == 0.3 #true puts 0.1 * 3.0 == 0.3 #false puts 0.1r * 2.0r #1/5 puts 0.1 * 2.0 #0.2 puts 0.1r * 5.0r #1/2 puts 0.1 * 5.0 #0.5 puts 0.1r * 6.0r #3/5 puts 0.1 * 6.0 #0.6000000000000001 puts 0.1r * 7.0r #7/10 puts 0.1 * 7.0 #0.7000000000000001
誤差の回避方法
では、このようなバグの元となる誤差をどのように回避するのか
=> Rationalクラスの数値に変換する
=> Rationalクラス ー 有理数クラスのことで、有理数とはa/bと言った分数で表せる数のこと
- 小数そのままの場合
=> 小数に"r"をつけることで、Rationalクラスの数値になる
0.1r # 1/10 3.0 # 3/1 0.1r * 3.0r #3/10 0.1r * 3.0r == 0.3 # true
- 小数を変数に代入している場合
rationalizeメソッドを使用する rationalizeメソッド => Rationalクラスの数値に変換する
a = 0.1 b = 3.0 puts a.rationalize * b.rationalize
- Rational(有理数)から普通の小数に戻したい場合
to_fメソッドを使用する
(0.1r * 3.0r ).to_f # 0.3
分数を計算したい場合
これはCherry本には載っていなかったのですが、気になって調べました 私下記の方法でいけると思っていたのですが、いけないんですね(笑)
(1/10)*(3/1) # 0
リファレンス確認しました
Rational(1,10) * Rational(3,1) #3/10 Rational(1,10) # 1/10 Rational(3,1) # 3/1
このようにすることで、分数の計算ができることがわかりました。
参考 「プロを目指す人のためのRuby入門」