丸め誤差

今日は単位がらみの訳文エラー検出プログラムを作ってたんですがちょっとばかしハマりました。
原文に「$1.38bn」という文字列があったら訳文に「13億8千万ドル」があるか、みたいなチェックを実装したんですが、ちゃんとそう訳されているのに

「$1.38bn=13億799999999999999千万ドルです!」

とエラーメッセージが出ている。

はあ?

1.38に10を掛けると
1.38×10=13.799999999999999
という計算結果が!

最初はFlashのバグかと思ったんですが、実はこれ、コンピュータの世界では有名な丸め誤差らしいです。
10進数で正確に表せる小数でも2進数(コンピュータの世界)では循環小数になってしまう(有限の桁数で表現できない)ことが多いためだそうです。

これに関連した面白い記事を発見したので興味ある人は読んでみよう!

ちなみに1.38に10を掛けた「13.8」という数字が欲しいなら、「100倍して四捨五入して10で割ればいい」という画期的な方法を発見して「すげーな俺!」と思ったんですが、実はこれも有名な解決策だったらしいっす。。。

コメントは受け付けていません。