2

たくさん足したいのですが、うまくいきません。

var searchSpace = 36;
var length = 11;
var combinations = 0;

for(var i = 1; i <= length; i++) {
    combinations += Math.pow(searchSpace, i);
}

変数combinationsは最終的に 135,382,323,952,046,190 になり、これは正確ではありません。135,382,323,952,046,196になるはずです(どうやって 6 ずれているの?!) 何かアイデアはありますか?

4

2 に答える 2

7

JavaScript は、数値形式として IEEE-754 64 ビット double を使用します。これらは任意の正確な値を表すことはできません。特定のしきい値を超えて、代わりに実際の値に近い (ただし正確ではない) 値を格納し始めると、それらは正しくなくなります。この以前の回答によると、正確に格納できる最大値は 2 53で、これは約 9 × 10 15です。あなたの数値 (約 1.3 × 10 17 ) はこれよりも大きいため、(かなりの確率で) 正確に表すことができません。

JavaScript で正確な答えを得たい場合は、任意精度の整数をサポートするライブラリを使用する必要があります。簡単な Google 検索でこのライブラリが見つかりましたが、それがどれほど正確かは保証できません。

お役に立てれば!

于 2012-06-15T04:17:00.457 に答える
4

Javascript のすべての数値は、実際には浮動小数点数です。非常に大きな数を扱っており、それらの数に対して複数の操作を行っています。この場合、フロートを処理する際の固有のエラーが急速に蓄積され、「エラー」が発生します。

これほど大きい数値で 6 ずれているのは、実際にはかなり良いことです。おおよそ 0.000000000000004431% しかずれていません

于 2012-06-15T04:17:30.190 に答える