2012-04-03 16 views
7

私は奇妙な問題に遭遇しました。私はいくつかの基本的な数学のチェックをしたいと思います。私は浮動小数点数を避けるために読んだので、私はの計算値をと掛けました。なぜなら、私の値は0.9と0.0025の間にあるからです。JavaScriptは正確ではありません

すべてが二つの値を除いて正しい動作します:0.56と0.57

var result = 0.57 * 10000 

結果は次のとおりです。5699.999999999999、私は5700を希望しました!そして0.56も間違っていますが、他の値はすべて正しいです、私はここで何が欠けていますか?

+4

[すべてのコンピュータ科学者は、浮動小数点演算について知っておくべきこと](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+0

バリエーション! – kojiro

答えて

3

JavaScript(実際のところ、ほとんどの言語)の選択肢は、整数または浮動小数点数です。 "0.57"と書くと、精度が制限されている浮動小数点の世界に強制されます。

絶対精度を求めている場合は、排他的に整数で作業する必要があります。

3
var result = 0.57 * 10000; 
alert (Math.round(result));​ 
0

ハックソリューション:value.toFixed(4).substr(-4).replace(/^0+/, "");

11

最善の解決策は、toFixed(X)を使用することで、常に期待される結果の小数(私は通常、そこに8を入れる)よりもあるべき小数点以下の桁数xを設定します。

しかし、-kirilloid-をハッキングする代わりに、不要な小数点以下の桁が削除されるように、結果を再び数値に変換する必要があります。その後、番号で好きなフォーマットを実行します。

だから、これに必要な結果を返します:

var result = +(0.57 * 10000).toFixed(8) 

を結果は前に今

+になり、再び数に「toFixed」の文字列の結果を変換します。

0
var multiply = function(a, b) { 
    var commonMultiplier = 1000000; 

    a *= commonMultiplier; 
    b *= commonMultiplier; 

    return (a * b)/(commonMultiplier * commonMultiplier); 
}; 

これは既知の範囲で機能します。したがって、小数点以下を小数点以下の桁数に変更することをお勧めします。commonMultiplierより小さい。有名なゴールドバーグ@JamesAllardice

> multiply(3, .1) 
< 0.3 
> multiply(5, .03) 
< 0.15