4

その有名な号については 1.01+1.022.0300000000000002

回避策の1つは使用することtoFixedです:例

(1.01+1.02).toFixed(2) --->"2.03"

しかし、私は toPrecision で解決策を見ました

parseFloat((1.01+1.02).toPrecision(10))-->"2.03"

nしかし、見てみましょう

  • toFixed(n)

  • toPrecision(n)

n が何であるかをどのように知ることができますか?

  0.xxxxxxxxxxx
+
  0.yyyyyyyyyyyyy
---------------------
  0.zzzzzzzzzzzzzzzzzzzzzzzzz
                ^ 
                |
-----??????------

追加される各数値は、異なる 10 進数を持つことができます...

例えば ​​:

1.0002+1.01+1.03333--> 3.0435300000000005

ここでどのように計算しnますか?この(特定の)問題のベストプラクティスは何ですか?

4

4 に答える 4

1

この状況での加算については、各オペランドの小数点以下の桁数を確認します。

最も単純な状況では、小数点以下の桁数が最大のオペランドの小数点以下の桁数が n の値になります。

これを取得したら、好きな方法を使用して値を切り捨てます。次に、末尾のゼロを取り除きます。

1.06 + 1.04 のような状況で末尾のゼロに遭遇することがあります。最初のステップでは 1.10 になり、ゼロを切り捨てると 1.1 になります。

最後の例 1.0002+1.01+1.03333 では、小数点以下の最大桁数は 5 であるため、3.04353 が残り、切り捨てる末尾のゼロはありません。

于 2012-11-29T08:34:59.920 に答える
0

計算を行っている場合は、いくつかの選択肢があります。

  • 数値に 100 などを掛けて整数に変換し、計算を行ってから再度変換します
  • 計算を行い、丸め誤差を気にせず、表示時に結果を丸めます

お金/通貨を扱っている場合、最初のオプションはおそらく悪いオプションではありません。あなたが科学的な数学をしているだけなら、私は個人的にそれについて心配することはなく、表示時に結果を丸めるだけです.たとえば、私のC ++コンパイラのデフォルトである有効数字6桁に丸めます.標準かどうかはわかりませんが1.234567890、gcc c++ で印刷すると、出力は1.23457になり、問題は回避されます)

于 2015-03-15T09:51:25.073 に答える
0
var a = 216.57421;

a.toPrecision(1); // => '200' because 216 with 1 < 5;
a.toPrecision(2); // => '220' because 216 with 6 >= 5;

a.toFixed(1); // => 216.6 because 7 >= 5;
a.toFixed(2); // => 216.57 because 4 < 5;
于 2016-09-09T03:51:22.267 に答える
0

これにより、期待される出力が返されます。

function add(){
    // Initialize output and "length" properties
    var length = 0;
    var output = 0;
    // Loop through all arguments supplied to this function (So: 1,4,6 in case of add(1,4,6);)
    for(var i = 0; i < arguments.length; i++){
        // If the current argument's length as string is longer than the previous one (or greater than 0 in case of the first argument))
        if(arguments[0].toString().length > length){
            // Set the current length to the argument's length (+1 is to account for the decimal point taking 1 character.)
            length = arguments[0].toString().length +1;
        }
        // Add the current character to the output with a precision specified by the longest argument.
        output = parseFloat((output+arguments[i]).toPrecision(length));
    }
    // Do whatever you with with the result, here. Usually, you'd 'return output;'
    console.log(output);
}
add();                     // Returns 0
add(1,2,3);                // Returns 6
add(1.01,2.01,3.03);       // Returns 6.05
add(1.01,2.0213,3.3333);   // Returns 6.3646
add(11.01,2.0213,31.3333); // Returns 44.3646

parseFloat末尾のゼロも取り除きます。

この関数は、パラメーターとして必要な数の数値を受け入れ、それらを追加するときに、数値の文字列の長さを考慮してこれらを合計します。加算で使用される精度は、「現在追加されている」引数の長さに合わせて動的に変更されます。

フィドル

于 2012-11-29T08:40:14.360 に答える