7

toFixed を使用すると、丸めエラーが発生します。

toFixed(2)数値計算で使用しましたが、丸めの結果が期待どおりにならない場合がまれにあります。

をvalueにtoFixed(2)適用すると17.525結果が得られ、17.52を適用すると5.525結果が得られるとし5.53ます。

後者の場合、丸め結果は正確ですので、後者の場合のように正確な丸め結果を得るために何をする必要があるか教えてください。または、正しい丸め結果を得るために、この toFixed 関数に代わるものを提案できますか?

4

4 に答える 4

5

浮動小数点の不正確さは、.525 で終わるほとんどの数値が実際には .52500..1 であり、その他は .5249999..... であることを意味します。

値がどのように丸められるかは、IEEE-754 浮動小数点での最も近い実際の表現が目的の値より上か下かによって異なります。

于 2012-05-26T17:06:48.340 に答える
3

toFixed()を使用する代わりにMath.ceil()Math.floor()またはMath.round()

のような方法で

var rnum = 5.525,
    decimalPlaces = 2,
    factor = Math.pow(10, decimalPlaces),
    newnumber = Math.round(rnum * factor) / factor,
    mydecimalvalue = parseFloat(newnumber); 

結果は5.53

于 2012-05-26T17:17:56.363 に答える
1

数値を文字列に変換して操作しますか?

これは、Math.round を使用しようとしたり、Math.ceil で最も近い丸めをシミュレートしたりしようとしたが失敗した後の最後の手段です。100 を掛けると、一部の数値 (17.525 など) はその値 (1752.5) の 100 倍より少し小さくなりますが、他の数値 (17.545 など) はその値の 100 倍 (1754.5) より少し大きくなります。

于 2012-05-26T17:02:56.187 に答える
1

Intl.NumberFormatを使用し、オプション セットminimumFractionDigitsmaximumFractionDigits同じ数値 (表示する桁数) に設定します。

const formatter = [0, 1, 2, 3, 4, 5].map(
    (decimals) =>
        new Intl.NumberFormat('en-US', {
            minimumFractionDigits: decimals,
            maximumFractionDigits: decimals,
        }),
);

console.log(formatter[2].format(17.525)); // 17.53
console.log(formatter[2].format(5.525)); // 5.53
console.log(formatter[2].format(1.005)); // 1.01
console.log(formatter[2].format(8.635)); // 8.64
console.log(formatter[2].format(8.575)); // 8.58
console.log(formatter[2].format(35.855)); // 35.86
console.log(formatter[2].format(859.385)); // 589.39
console.log(formatter[2].format(859.3844)); // 589.38
console.log(formatter[2].format(.004)); // 0.00
console.log(formatter[2].format(0.0000001)); // 0.00

// keep in mind that this will not be formatted as expected, as the value that
// you pass is actually 0.07499999999998863. 
console.log(formatter[2].format(239.575 - 239.5)); // 0.07
console.log(formatter[2].format(0.07499999999998863)); // 0.07

于 2020-05-28T13:04:35.093 に答える