消費税計算では、計算方法によっては丸め誤差が発生し、それが原因で1円ずれる可能性があります。 ここでは丸め誤差が発生する計算方法を使って、丸め誤差が発生する金額を確認します。
サンプル
消費税率8%の誤差確認サンプル。税抜価格が1000~1999の範囲で、誤差が発生する金額を求めています。
var rate = 8; var diff; var value; for (var i = 1000; i < 2000; i++) { value = i * ((100 + rate) / 100); diff = value - Math.floor(value); if (0 < diff && diff < 0.00001) { console.log(i, value, diff); } }
このファイルをrounding_error.js として、Node.jsで実行すると、以下のようになります。
node rounding_error.js実行結果
$ node rounding_error.js 1625 1755.0000000000002 2.2737367544323206e-13 1650 1782.0000000000002 2.2737367544323206e-13 1675 1809.0000000000002 2.2737367544323206e-13 1700 1836.0000000000002 2.2737367544323206e-13 1725 1863.0000000000002 2.2737367544323206e-13 1750 1890.0000000000002 2.2737367544323206e-13 1775 1917.0000000000002 2.2737367544323206e-13 1800 1944.0000000000002 2.2737367544323206e-13 1825 1971.0000000000002 2.2737367544323206e-13 1850 1998.0000000000002 2.2737367544323206e-13 1875 2025.0000000000002 2.2737367544323206e-13左から、税抜価格、計算結果(8%消費税込み価格)、誤差になります。
この計算結果の場合、端数処理が切り上げだと、正しい8%消費税込み価格より1円高くなります。 例えば 1625円 の 8%消費税込み価格は、1755円が正解ですが、上記の計算結果 1755.0000000000002 を切り上げると 1756円 となります。
丸め誤差を出さない計算方法
今回のサンプルでは、税込み価格を求める箇所を以下のように変更すると、今回のテストでとりあえず丸め誤差が出ないようになります。 ただし、これはJavaScriptの実装に依存する可能性があるので、これで確実に丸め誤差がでないようになるとは保証できません。
value = (i * (100 + rate)) / 100;
その他として、以下のような公開された数値計算用ライブラリを使う方法があります。