77

そこで、問題が発生した 2 つの数値 (10 進数) を加算するスクリプトを作成しています。

http://jsfiddle.net/DerekL/esqnC/

私はスクリプトを作成しました、それはかなり良いことがわかりました:

0.1 + 0.5  //0.6
0.2 + 0.3  //0.5

しかし、すぐに次のことがわかります。

0.1 + 0.2  //0.30000000000000004
0.01 + 0.06  //0.06999999999999999

そして、それは私には正しく見えません。有限ビットで浮動小数点を使用することの欠点であることは知っていますが、それを修正する方法が見つかりません。

Math.ceil   //No
Math.floor  //No
.slice      //No

アップデート

最初に1000を掛けてから足し、1000で割ることはできますか?

4

4 に答える 4

91

を使用toFixedして、小数点以下の桁数を切り捨てた文字列に変換してから、数値に戻します。

+(0.1 + 0.2).toFixed(12) // 0.3

IE には奇妙な動作があるように見えるtoFixedので、IE をサポートする必要がある場合は、次のような方がよいかもしれません。

Math.round((0.1 + 0.2) * 1e12) / 1e12
于 2012-05-06T20:34:10.480 に答える
11
function add(){
    var first=parseFloat($("#first").val());
    var second=parseFloat($("#second").val());
    $("#result").val(+(first+second).toFixed(2));
}

デモ。

于 2012-05-06T20:52:39.633 に答える
11

これは、浮動小数点でよくある問題です。

toFixedと組み合わせて使用​​しparseFloatます。

JavaScript の例を次に示します。

function roundNumber(number, decimals) {
    var newnumber = new Number(number+'').toFixed(parseInt(decimals));
    return parseFloat(newnumber); 
}

0.1 + 0.2;                    //=> 0.30000000000000004
roundNumber( 0.1 + 0.2, 12 ); //=> 0.3
于 2012-05-06T20:54:02.363 に答える
7

このJavascriptのテスト:

var arr = [1234563995.721, 12345691212.718, 1234568421.5891, 12345677093.49284];

var sum = 0;
for( var i = 0; i < arr.length; i++ ) {
    sum += arr[i];
}

alert( "fMath(sum) = " + Math.round( sum * 1e12 ) / 1e12 );
alert( "fFixed(sum) = " + sum.toFixed( 5 ) );

結論

使用しないでくださいMath.round( (## + ## + ... + ##) * 1e12) / 1e12

代わりに、( ## + ## + ... + ##).toFixed(5) )

IE 9では、toFixed非常にうまく機能します。

于 2012-11-14T22:06:03.287 に答える