1. ホーム
  2. javascript

JavaScript によるガウス/バンカー丸め処理

2023-09-29 13:25:28

質問

私はこれまで Math.Round(myNumber, MidpointRounding.ToEven) を使っていましたが、ユーザーはサーバーサイドの演算結果がどうなるかを「生で」知る必要があります。 Ajax リクエストを避けるため) JavaScript のメソッドを作成して MidpointRounding.ToEven メソッドを作成します。

MidpointRounding.ToEvenはGaussian/です。 銀行丸め と記述された会計システムで非常に一般的な丸め方法です。 ここで .

どなたか経験のある方はいらっしゃいますか?私はオンラインで例を見つけましたが、それらは に丸められません。 小数点以下の桁数に丸められない...。

どのように解決するのですか?

function evenRound(num, decimalPlaces) {
    var d = decimalPlaces || 0;
    var m = Math.pow(10, d);
    var n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
    var i = Math.floor(n), f = n - i;
    var e = 1e-8; // Allow for rounding errors in f
    var r = (f > 0.5 - e && f < 0.5 + e) ?
                ((i % 2 == 0) ? i : i + 1) : Math.round(n);
    return d ? r / m : r;
}

console.log( evenRound(1.5) ); // 2
console.log( evenRound(2.5) ); // 2
console.log( evenRound(1.535, 2) ); // 1.54
console.log( evenRound(1.525, 2) ); // 1.52

ライブデモです。 http://jsfiddle.net/NbvBp/

これより厳密な処理のようですが(私は使ったことがありません)、次のようにするとよいでしょう。 ビッグナンバー の実装を試してみてください。