3

John Resig の関数を使用して配列内の最小値を見つけていますが、どういうわけかフロア値を返します。これがデモで、これがコードです。

 var arr = Math.min.apply(Math, [310127563311820800, 310127563190202368, 310127563110502401, 310127562443595776, 310127562326163457, 310127561751556097]);
document.write(arr);

何が起こったのか、なぜ間違った (フロア化された) 値を返すのか説明できますか?

4

2 に答える 2

4

問題は最小値を見つけることではなく、それらの数値を使用することです。-9007199254740992整数は と の間でのみ完全に保持できるため、JavaScript で数値として表すことはできません+9007199254740992

これは、JavaScript のすべての数値が倍精度のIEEE754浮動小数点数であり、仮数のサイズが 53 であるためです。

数値型に関する ECMAScript 仕様の詳細を参照してください。

大きさが 253 以下のすべての正および負の整数は Number 型で表現できることに注意してください (実際、整数 0 には +0 と -0 の 2 つの表現があります)。

これらの数値を扱う (そしてその最小値を見つける) には、ネイティブの JavaScript 数値とは別の表現を使用する必要があります。bignumなど、大きな数を扱うライブラリがたくさんあることを願っています (ただし、ググって好きなものを選ぶ必要があります)。

于 2013-03-08T21:20:34.917 に答える
1

数字の入力文字列を作成しない限り、JavaScriptの精度が低下します。

それらがすべて正の整数である場合は、それらを並べ替えて、インデックスが最も低い要素を返すことができます。桁数が多い文字列は、桁数が少ない文字列よりも大きくなければならないことに注意してください。

var input= ['310127563311820800', '310127563190202368', '310127563110502401',
'310127562443595776', '310127562326163457', '310127561751556097'];


var minim= input.slice(0).sort(function(a, b){
    if(a=== b) return 0;
    if(a.length!= b.length) return a.length-b.length;
    return a>b? 1:-1;  
})[0];

alert(minim);

/*  returned value: (String)
310127561751556097
*/

元の順序を維持する必要がない場合は、slice(0)ビットをスキップできます。

于 2013-03-09T01:44:08.867 に答える