4

数値を小数点以下2桁に修正しようとしています。そのためtoFixedに、javascriptの機能を使用しています。以下は、私が得ている奇妙な結果です。確認して助けてください。

変数番号 = 11.995;
number.toFixed(2); //正しい 11.99 が表示されます

変数番号 = 19.995;
number.toFixed(2); //間違っている 20.00 を返します

なぜそれが起こっているのか誰にも教えてもらえますか。

ご協力いただきありがとうございます。

4

4 に答える 4

6

これが浮動小数点演算の仕組みです。値19.995は、正確な2進数(基数2)ではありません。より明確にするために、10/3を割るときの正確な数を考えてください。

詳細な説明については、次をお読みください:http: //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

あなたの場合、代わりに文字列を扱うことができます(少なくともそれはあなたが望むもののようです):

number.toString().substr(0, n);

または、次のような関数を定義します(2分で作成、単なる例):

Number.toFixed = function(no, n) {
    var spl = no.toString().split('.');
    if ( spl.length > 1 ) {
        return spl[0]+'.'+spl[1].substr(0,n);
    }
    return spl[0];
}

Number.toFixed(19.995, 2); // 19.99
于 2012-08-24T08:44:41.643 に答える
1

私は私のためにすべてを行った関数を作成しました..

    function toFixed(number, precision) {
        var multiplier = Math.pow(10, precision + 1),
            wholeNumber = Math.floor(number * multiplier);
        return Math.round(wholeNumber / 10) * 10 / multiplier;
    }

   //Call this function to retrive exect value
    toFixed((+adjustmentval), 2);
于 2015-03-13T05:28:38.430 に答える
1

toFixed値を丸めます。19.995 は 19.99 と 20.00 の丁度中間であるため、どちらかを選択する必要があります。伝統的に、丸めは偶数の結果を優先します (これにより、切り上げと切り下げが等しくなるため、偏りが防止されます)。

于 2012-08-24T10:42:31.450 に答える
0

デビッドは私が推測しているあなたの疑問に答えました. ここで代替ソリューションを提供するだけです。

Math.floor()これには Math オブジェクトのメソッドを使用できます。

このようなもの、Math.floor(number*100)/100

于 2012-08-24T09:01:13.720 に答える