web-dev-qa-db-ja.com

Javascript長整数

私はjavascriptで最も奇妙なものの1つを見てきました。サーバー側(スプリング):

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

私は単一の長い値を返します:

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

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

サーバーからlongではなく文字列を返し、それを次のように処理します。

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

明らかに解決策。しかし、私はそれほど幸運ではありません。いくつかのフィールド(一部はネストされている)がJava.lang.Longタイプ。このPOJOをLong型のフィールドを持たない別のオブジェクトにキャストしようとすると、明らかに面倒です。

その障害をより明確に解決する方法はありますか?

45
px5x2

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

JavaScriptでは、すべての数値は 64ビット浮動小数点数 です。これは、JavaScriptですべてのJava longsを表すことができないことを意味します。仮数のサイズは約53ビットです。つまり、番号793548328091516928、JavaScript番号として正確に表すことはできません。

そのような数値を本当に扱う必要がある場合は、別の方法で表す必要があります。これは、文字列、または数字配列のような特定の表現です。 JavaScriptでいくつかの「大きな数字」のライブラリを利用できます。

72
Denys Séguret

遅れることもありますが、この状況を初めて実行する他の人を確実に助けます。

私も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>