何もかもが初心者ですが

プログラミングもアウトプットもブログも初心者ですが、初心者なりに成長するためにブログを書こうと思います

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入門」