2013-06-26 16 views
25

私はジャバスクリプトの中で奇妙なものの1つを見ました。 サーバ側(スプリング):私は、単一の長い値と戻りJavaScriptの長整数

@RequestMapping(value = "/foo", method = RequestMethod.GET) 
    @ResponseBody 
    public Long foo() { 
     return 793548328091516928L; 
    } 

$.get('/foo').done(function(data){ 
    console.log(data); 
}); 

を「793548328091516900」が0で(実際に丸め)、最後の2桁を交換するように、長い整数を表します。 。任意のブラウザのアドレスバーからそのGETリクエストを作成すると、数字が正しく表示されます。私の意見では、これはjsの問題です。

サーバから長いのではなく、文字列を返すとでハンドリング:明らかに

var x = new Number(data).toFixed(); 

ソリューション。しかし、私はいくつかのフィールド(いくつかはネストされている)がjava.lang.Longタイプでタイプされた複雑なPOJO(JSONに変換されたもの)を処理する必要があります。このPOJOを、Long型のフィールドを持たない別のオブジェクトにキャストしようとすると、明らかに面倒です。

この障害を解決する方法はありますか?

答えて

45

Javaでは、64ビットの整数があり、これが使用しているものです。

JavaScriptでは、数字はすべて64 bits floating point numbersです。つまり、JavaではすべてのJavaロングをJavaScriptで表現することはできません。仮数のサイズは約53ビットです。つまり、あなたの番号793548328091516928をJavaScriptの数字として正確に表すことはできません。

このような番号を本当に扱う必要がある場合は、別の方法で表現する必要があります。これは、文字列、または数字配列のような特定の表現である可能性があります。いくつかの "ビッグナンバー"ライブラリはJavaScriptで利用可能です。

+0

は、その解決策がないことを意味? – px5x2

+6

@ px5x2「javascript番号」ベースのソリューションはありません。問題に対する最良の解決策は、正確な要件に依存します。表示するだけの場合は、それらを文字列として送信します。 –

+0

@dystroy:タイムゾーンのために悪い考え –

4

遅くなる可能性がありますが、この状況を初めて実行する他の人には間違いなく助けになります。

JavaScriptでも大量の計算が必要でした。そのような数字に対処するために利用できるライブラリがたくさんあります。しかし、彼らのほとんどはあなたの時間を無駄にするかもしれません。 ここでは、https://github.com/peterolson/BigInteger.jsは、直接的で完全な(非ノード環境およびノー​​ドJS環境用)、多数の利用可能なすべての操作のための作業ソリューションです。 またはモジュロ/剰余を計算し、次の簡単なサンプル作業HTMLコードスニペットを見つけ、

<script src="http://peterolson.github.com/BigInteger.js/BigInteger.min.js"></script> 
<script type="text/javascript"> 
    function modTest(){ 
     var rem = bigInt("1738141852226360940").mod("32").valueOf(); 
     console.log(rem); 
     document.getElementById("remainder").innerHTML = rem; 
    } 
</script> 

<BODY onload="modTest();"> 
    <p id="remainder"></p> 
</BODY> 
関連する問題