57

私は JavaScript で最も奇妙なものの 1 つを見てきました。サーバー側 (春):

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

単一の long 値を返します。

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

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

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

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

明らかに解決策です。しかし、幸運なことに、一部のフィールド (一部はネストされている) が type でjava.lang.Long型指定されている複雑な POJO (JSON に変換) を処理する必要があります。この POJO を、Long 型のフィールドを持たない別のオブジェクトにキャストしようとすると、明らかに面倒です。

その障害に対するより明確な解決策はありますか?

4

3 に答える 3

92

Java では、64 ビットの整数があり、それを使用しています。

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

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

于 2013-06-26T13:01:12.030 に答える
1

長いnpm パッケージを使用できます。

64 bits integersJavaScript で使用できます。

BigIntJavaScript 組み込みメソッドを使用することもできます。

于 2020-04-15T12:14:28.353 に答える