それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

整数の四捨五入でメソッドCallをしなくてもいい。

RubyのIntで四捨五入・切り捨て・切り上げ

Rubyのint型には四捨五入・切り捨て・切り上げをするメソッドがないと仮定する。

ページャとか作ってると、Intでも10ずつ切り上げたり切り下げたい。

よく見かけるFixNumの例

randarr=(1..10).map {|i| rand(100)}  #=> [58, 92, 83, 58, 29, 62, 4, 4, 40, 81]
randarr.map{|i| i.ceil   }            #=> [60, 100, 90, 60, 30, 70, 10, 10, 40, 90]
randarr.map{|i| i.floor }            #=> [50, 90, 80, 50, 20, 60, 0, 0, 40, 80]
randarr.map{|i| i.round }            #=> [60, 90, 80, 60, 30, 60, 0, 0, 40, 80]

昔見かけたなぜかto_fをしている例。

randarr=(1..10).map {|i| rand(100)}  #=> [58, 92, 83, 58, 29, 62, 4, 4, 40, 81]
randarr.map{|i|(i.to_f/10).ceil*10}  #=> [60, 100, 90, 60, 30, 70, 10, 10, 40, 90]
randarr.map{|i|(i.to_f/10).floor*10} #=> [50, 90, 80, 50, 20, 60, 0, 0, 40, 80]
randarr.map{|i|(i.to_f/10).round*10} #=> [60, 90, 80, 60, 30, 60, 0, 0, 40, 80]

いちいち.floorしてるのは無駄だろう?

randarr=(1..10).map {|i| rand(100)}  #=> [58, 92, 83, 58, 29, 62, 4, 4, 40, 81]
randarr.map{|i| i-i%10 }             #=> [50, 90, 80, 50, 20, 60, 0, 0, 40, 80]
randarr.map{|i| i-i%10+10 }          #=> [60, 100, 90, 60, 30, 70, 10, 10, 50, 90]
randarr.map{|i|i+5 }.map{|i| i-i%10 }#=> [60, 90, 80, 60, 30, 60, 0, 0, 40, 80]


何事も、工夫次第。

四捨五入・切り捨て・切り上げは10単位。

だけれど、ページャを作るとしたら8個単位。5個単位・・・など区切る数字は不定だ。

5個ごとに合わせる
randarr.map{|i| i-i%5 }             #=> [55, 90, 80, 55, 25, 60, 0, 0, 40, 80]
randarr.map{|i| i-i%5+5 }           #=> [60, 95, 85, 60, 30, 65, 5, 5, 45, 85]
randarr.map{|i|i+3 }.map{|i| i-i%5 }#=> [60, 95, 85, 60, 30, 65, 5, 5, 40, 80]
randarr.map{|i|i+2 }.map{|i| i-i%5 }#=> [60, 90, 85, 60, 30, 60, 5, 5, 40, 80]
20個ごとに区切る?
randarr=(1..10).map {|i| rand(100)}  #=> [58, 92, 83, 58, 29, 62, 4, 4, 40, 81]
randarr.map{|i| i-i%20 }             #=> [40, 80, 80, 40, 20, 60, 0, 0, 40, 80]
randarr.map{|i| i-i%20+20 }          #=> [60, 100, 100, 60, 40, 80, 20, 20, 60, 100]

こういうのをさっと計算できると、ページャとか数字に強いよね。