4

重複の可能性:
Javascriptで誤って丸められた多数

jQuery.parseJSON()を使用してjson文字列を取得し、それをオブジェクトにします。json文字列は、最初のマークアップを使用してサーバーによってスクリプトタグに配置されます。json文字列には、当社のWebサイト上のさまざまなリソースを参照する値が含まれています。

これの実装には、開発では見落とされていた問題があり、今では頭を抱え始めています。私たちのサーバーはJavaベースです。数値は、ほとんどの場合、Longsとして表されます。したがって、json文字列には「...'id':25783071737028608...」のようなものがあります。この値がJS数値タイプの最大値を10の2乗で超えるため、これは問題です。この場合、数値は切り上げられます:25783071737028610。これにより、あらゆる種類のデータの不整合の問題が発生します。

このタイプのパターンは、当社のWebサイトに広く普及しており、値はデータベースの値を表しています。データベースの大規模なリファクタリングは避けたいです。また、文字列としてブラウザに渡すだけでは避けたいと思います( "...'id':" 25783071737028608 "..."。javascriptに渡される長いインスタンスをすべて見つけるには、データベースの大規模なリファクタリングが必要になるためです。

JavaScriptでJavaの長い型を表す方法はありますか?いいえの場合(私はそうだと思います)、同様の問題を解決するために使用した可能性のある創造的な回避策はありますか?

4

3 に答える 3

3

すでに述べたように、値はJavaScriptの最大整数値を超えているため、値を文字列として渡すか、独自のJavaScript JSONパーサーを記述して(またはjQueryを変更して)長整数値を文字列として解析する以外に実際にできることはありません。

于 2012-08-31T18:36:39.307 に答える
0

サーバーで数値を文字列としてエンコードするか、JavaScriptで独自のJSONパーサーを記述して、大きすぎる数値定数を処理する必要があります。

(SOには、これとほぼ同じ質問が少なくとも1つあります。)

編集—申し訳ありませんが、エンコーディングを変更できないとおっしゃった部分を見逃しました。幸いなことに、JSON2パーサーのソースを取得して変更し、おそらくすべての数値定数を文字列として解釈するか、特定の桁数を超えるものとして解釈できるようにする必要があります。

eval()おっと、json2.jsの「パーサー」は、呼び出しが問題を引き起こさないことを保証する単なるサニタイザーです。それでも、このアプローチが唯一の選択肢だと思います。JSON式の構造が規則的で十分に単純な場合は、正規表現を使用して事前解析を「修正」できる可能性がありますが、そうでない場合は、JavaScriptのJSONパーサーがそれです。

于 2012-08-31T18:24:54.303 に答える
-1

JavaScriptの数値は倍精度浮動小数点数であり、約15桁の精度を持っています。15桁を超える数値は、と同じ方法で概算され1/3ます。

文字列に変更できたとしても、数字を操作することはできません。正直なところ、クアッドリリオンにID番号がある理由は考えられません...

于 2012-08-31T18:37:49.447 に答える