JavaScriptの2進数演算による誤差についてメモ。
a = 4.321 * 100;
を計算すると、期待値「432.1」に反して、「432.099999999999996」になります。
四捨五入で対応しようとして、
b = Math.round(4.321 * 100 * 10) / 10;
とすると、「432.1」が得られますが、同じ式で
c = Math.round(4.9999 * 100 * 10) / 10;
の結果は、期待値「499.99」ではなく「500」になってしまいます。
そこで、Decimal的(文字列)操作を関数化したもの(decimaloperater.js)を使って、
d = trimFixed(4.9999 * 100);
とすると、正しく「499.99」が得られるようです。動作している処理系で扱える有効桁数を目一杯使っているかどうかで、丸めるかどうかを判定しています。演算結果に対しての処理なので、これなら除算もOK。すばらしい!
もっと、厳密にやりたいってヒトは、JavaScript用のBigDecimalクラスを使うのがいいのでしょうかね。版権的にどうなのかわからないのですけど。。。IBM?
e = new BigDecimal("4.321").multiply(new BigDecimal("100"))