web-dev-qa-db-ja.com

JSON長い数値を適切に変換しない

数値が適切に解析されていない単純なJSONがあります。

[
  {
    "orderNumber": 1,
    "customerId": 228930314431312345,
    "shoppingCartId": 22893031443137109,
    "firstName": "jjj"
  }
]

@ http://www.utilities-online.info/xmltojson/ で試してみたところ、結果は

<?xml version="1.0" encoding="UTF-8" ?>
<orderNumber>1</orderNumber>
<customerId>228930314431312350</customerId>
<shoppingCartId>22893031443137108</shoppingCartId>
<firstName>jjj</firstName>

ご覧のとおり、XMLはJSONとは異なります。 JSONは初めてです。私は何かが足りないのですか?

11
Jeet

これはJavascriptの精度の問題です。

Mozilla Developer Networkによると:

ECMA-262は、最大21桁の有効数字の精度のみを必要とします。他の実装では、標準で要求されるよりも高い精度がサポートされていない場合があります。

ソース: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toPrecision

配列をGoogleChromeのJavascriptコンソールに貼り付けて、次のように戻しました。 Javascript precision bug

したがって、Javascriptは、XMLに変換される前に値を丸めているように見えます。変換はブラウザのJavascriptを介して http://www.utilities-online.info/xmltojson/ で行われているため、番号が変更された理由は理にかなっています。

(注:GoogleでテストしましたChromeバージョン26.0.1410.43m、Windows 7 Professionalを使用)

編集:

これらの値を文字列としてJavascriptに渡せない理由はありますか?

これを試して:

[
  {
    "orderNumber": "1",
    "customerId": "228930314431312345",
    "shoppingCartId": "22893031443137109",
    "firstName": "jjj"
  }
]

これを実行して、値を正常に保存することができました。ただし、もちろん0を掛けるようなことをしない限り、Javascriptでそれらに対して数学計算を実行することはできません。

Javascript precision string workaround

これも、参照を使用して正しくXMLに変換されます http://www.utilities-online.info/xmltojson/

10
Aiias

Javascriptは、その数値を倍精度浮動小数点数として表します。これにより、表現できる最大の整数が+ -9007199254740992に制限されます。これが [〜#〜] ecma [〜#〜] ドキュメントです。

3
David Weber