ぱろっと・すたじお

技術メモなどをまったりと / my site : http://parrot-studio.com/

formatに小数を渡した時の値が環境によって違う

Rubyでシステムを開発するとき、
普段はmswin32のRubyを使い、本番ではLinux(CentOS 5.3 x64)のRubyを使ってます


それをふまえて、以下のコードを(´・ω・)っ

f = 65.0/32.0
p f                 #=> 2.03125
p format("%.4f", f) #=> ????

どうってことないコードなのですが、
実はこれ、実行環境によって値が変わってしまいます

mswin32 => "2.03123"
 linux  => "2.03122"

おそらくこれはCコンパイル環境の違いだとは思うのですが、
原因を追及すると深みにはまる*1ので、
あっさりとroundメソッドに頼ることに*2

require 'active_record' # 1.8系のみ 1.9は取り込み済
f = 65.0/32.0
p f                          #=> 2.03125
#p format("%.4f", f)         
p format("%.4f", f.round(4)) #=> 2.0313 on Win/Linux

幸い、こんなこともあろうかと、
小数計算するような個所は全てメソッドで分離されていたので、
修正は軽微でした(`・ω・´) b


ちなみに、コードのコメントにもありますが、
1.9系はFloat#round(n)が定義されています


http://www.rubyist.net/~matz/20070528.html#p05


このあたりの対応の柔軟さはさすがというべきか・・・

*1:LL言語で小数計算するのはプロじゃないとか・・・(´・ω・`)

*2:そもそもコンピュータで厳密な小数計算をするつもりなら、全部下駄を履かせなきゃ無理ですし