Matzにっき(2007-05-28) → hnwの日記 - PHPの奇妙なround関数 → PHP Bugs: #24142: round() does 5.045 to 5.04 instead of 5.05,無知は恐ろしい!
昔Excelの演算誤差という駄文を書いたことがあるが,最近のExcelで検証していない。どなたか詳しく調べてくれないかなぁ。
# 御無沙汰してます。
一瞬、IEEE 754 の話かと思ったのですが、違うんですね。
あれれ,どうもご無沙汰しています。 IEEE 754も含めて2進の浮動小数点数に共通する話です。10進で有限小数でも2進で無限小数になるので0.01を100回加えても1にならなかったりするわけですが,素人はそれがわからずバグだと騒ぐので,素人対策におかしな処理を入れることによって,玄人の数値計算に使えないような仕様になってしまうという話です。昔のTurbo PascalのようにBCDを選択できるようにするのも手かもしれません。
日本MySQLユーザ会のFAQではROUND()について以下のような説明をしていました。
プラットホーム独立なソフトウェアにとってROUNDは鬼門なのでしょうか
http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_10
四捨五入 ROUND() は四捨五入ではない場合がある。OS の C ライブラリに依存する。
確実に四捨五入したければ、FLOOR() か TRUNCATE() を使用する。 FLOOR(c+0.5) や TRUNCATE(c+0.05, 2)
いえ,それはそれでいいのです。このPHPの話はそういうレベルではなく,笑っちゃうような処理が含まれているというのが問題です。
そうですね。わたしも「IEEE 754 の round to even の話」と書こうとして端折ってしまったのでした。
そうなんです。そういうレベルの話ならいいのですが,単にコンピュータが2進であることを知らないタコユーザが,期待通りに働かないとケチをつけて,その場かぎりうまくいくように0.000...01を足したりするような傑作な処置をしたという話のようです。
IEEEの話かと思った
# 御無沙汰してます。
一瞬、IEEE 754 の話かと思ったのですが、違うんですね。
Re: IEEEの話かと思った
あれれ,どうもご無沙汰しています。
IEEE 754も含めて2進の浮動小数点数に共通する話です。10進で有限小数でも2進で無限小数になるので0.01を100回加えても1にならなかったりするわけですが,素人はそれがわからずバグだと騒ぐので,素人対策におかしな処理を入れることによって,玄人の数値計算に使えないような仕様になってしまうという話です。昔のTurbo PascalのようにBCDを選択できるようにするのも手かもしれません。
MySQLでもROUNDは環境依存?
日本MySQLユーザ会のFAQではROUND()について以下のような説明をしていました。
プラットホーム独立なソフトウェアにとってROUNDは鬼門なのでしょうか
http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_10
四捨五入 ROUND() は四捨五入ではない場合がある。OS の C ライブラリに依存する。
確実に四捨五入したければ、FLOOR() か TRUNCATE() を使用する。
FLOOR(c+0.5) や TRUNCATE(c+0.05, 2)
Re: MySQLでもROUNDは環境依存?
いえ,それはそれでいいのです。このPHPの話はそういうレベルではなく,笑っちゃうような処理が含まれているというのが問題です。
Re: MySQLでもROUNDは環境依存?
そうですね。わたしも「IEEE 754 の round to even の話」と書こうとして端折ってしまったのでした。
Re: MySQLでもROUNDは環境依存?
そうなんです。そういうレベルの話ならいいのですが,単にコンピュータが2進であることを知らないタコユーザが,期待通りに働かないとケチをつけて,その場かぎりうまくいくように0.000...01を足したりするような傑作な処置をしたという話のようです。