web-dev-qa-db-ja.com

bigintのJSON転送:12000000000002539は12000000000002540に変換されますか?

私は[{id: 12000000000002539, Name: "Some Name"}]のような生データを転送していて、解析後にオブジェクト[{id: 12000000000002540, Name: "Some Name"}]を取得しています。今のところ、サーバー側でIDを文字列に変換すると役立つようです。しかし、bigintデータを正しく転送するためのより良い方法はありますか?

50
feipinghuang

値は実際にはJavaScriptの最大数値(「のみ」1.7)を超えていない308 とか、ぐらい)。

ただし、値で「積分精度」の範囲を超えています。間違った番号が送信されるということではありません。むしろ、literal12000000000002539は、正確には12000000000002540、つまりJavaScriptには正しい数値がneverありませんでした。 ( 積分範囲 は約+/- 2です53。)

これは、すべての数値を格納するために double relative-precision (IEEE-754でのbinary64)タイプを使用する興味深い現象です。整数を含む値:

12000000000002539 === 12000000000002540 // true

数値として正確に格納される有効桁数の最大桁数は15(実際には15.95)です。上記では、有効数字が17桁あるため、最下位の情報の一部が静かに失われます。この場合、asJavaScriptパーサー/エンジンはリテラル値を読み取ります。

JavaScriptでこの大きさの整数を処理する唯一の安全な方法は、文字列リテラルを使用するか、別の方法でそれを分解することです(たとえば、カスタム数値型または "bigintライブラリ" )。ただし、文字列を使用することをお勧めします。これは、人間が読める形式で、比較的コンパクト(JSONで2文字だけ)で、特別な文字列を必要としないためです。シリアル化。この場合、値は単なる "id"なので、数学を実行する必要がないことを願っています:)

ハッピーコーディング。

88
user166390