2009-04-06 3 views
2

私は興味深い質問があります。私はjavascriptでいくつかの作業をしています。データベースIDは "3494793310847464221"として出てきました。これは現在番号としてjavascriptに入力されていますアラートに出力されたときと別のjavascript関数に渡されたときの両方で、この数値を別の値として使用しています。Javascriptでこの番号を正しく表示できません:3494793310847464221

エラーを最大限に表示するためのコード例を示します。

<html><head><script language="javascript">alert(3494793310847464221); 
var rar = 3494793310847464221; 
alert(rar); 
</script></head></html> 

これはcompletlyところで数が数その後、179以上である...

私をbaffeledとGoogleは私の友人ではありません一度のためにしている...

答えて

4

ではなく、文字列を使用してください。

0

ちょうど推測ですが、おそらく数値は浮動小数点型として格納されていますが、その差は丸め誤差のためかもしれません。そうであれば、別のインタープリタ(ブラウザやそれを実行しているもの)を使用すると正しく動作するかもしれません。

1

intとして格納するのは大きいので、floatに変換されます。 JavaScriptでは、therは明示的な整数型と浮動小数点型ではなく、汎用のNumber型のみです。

+0

Javascriptをint型 – mkoryak

+0

@mkoryak持っていない:本当の、しかし、これは本当に真実ではない – Christoph

15

あなたの番号はJavaScriptの最大許容整数値(2^53)を超えています。これはこれまでにWhat is JavaScript's highest integer value that a Number can go to without losing precision?

+3

を必要なときに浮動小数点値は、暗黙的に整数に変換されます。 64ビット浮動小数点として表現できる限り、「許可」されているより大きな整数があります。ここでの関連情報は、JavaScriptコードが浮動小数点数であることです。リンク先のポストで述べたように、整数ではありません。 – mweerden

3

179で表示されています。もう1つの方法は、最初の16桁の後に、それ以上の桁は0です。詳細はわかりませんが、変数は16桁までしか格納できないようです。

12

JavaScriptでは、すべての数値(整数であっても)はIEEE-754浮動小数点数として格納されます。しかし、FPは「精度」に制限があります(詳細はWikipedia articleを参照)ので、番号を正確に表現することはできません。

数字を文字列として保存するか、他の "bignum"アプローチを使用する必要があります(残念ながら、私の頭の上からJS bignumライブラリはわかりません)。

編集:JavaScriptのBIGNUMライブラリの方法で行わ多くの作業が行われていたかのよう少し掘りを行った後、それはいないようです。実際に、私が見つけたあらゆる種類の唯一のbignum実装は、Edward MartinのJavaScript High Precision Calculatorです。

+0

私が好きな既存のJSライブラリを見つけることができなかったので、私はJavaScriptの大規模整数ライブラリに取り組んできました。コードはhttp://github.com/silentmatt/javascript-bigintegerにあります。 –

2

その数は(2^31)-1を超えています。これが問題です。 javascriptは、32ビット符号付き整数(つまり、-2,147,483,648から2,147,483,647までの範囲)を使用します。文字列を使用して文字列を数値として操作する関数を作成することをお勧めします。

あなたが必要とするライブラリをすでに持っていたとしても、それほど驚きはありません。これは、あなたが任意の精度の整数を格納することができますが、それは標準の算術ほど速くはありませんhttp://www.leemon.com/crypto/BigInt.html

+0

これは、javascript番号が64ビット浮動小数点型であるという記述とどのように一致しますか? – xtofl

+0

@xtofl:倍精度浮動小数点値は、32ビット整数の範囲を正確に表現できます。また、ビット演算子は数値の整数表現を使用して定義されるため、JS数は整数のように動作することがありますが、組み込み型は浮動小数点です – Christoph

2

一つの可能​​な解決策は、次のようなのBigIntライブラリを使用することです。

1

「文字列を簡単に増減できません...」

本当に?

 
function incr_num(x) { 
    var lastdigit=Number(x.charAt(x.length-1)); 
    if (lastdigit!=9) return (x.substring(0,x.length-1))+""+(lastdigit+1); 
    if (x=="9") return "10"; 
    return incr_num(x.substring(0,x.length-1))+"0"; 
} 

function decr_num(x) { 
    if(x=="0") return "(error: cannot decrement zero)"; 
    var lastdigit=Number(x.charAt(x.length-1)); 
    if (lastdigit!=0) return (x.substring(0,x.length-1))+""+(lastdigit-1); 
    if (x=="10") return "9"; // delete this line if you like leading zero 
    return decr_num(x.substring(0,x.length-1))+"9"; 
} 
関連する問題