androidのJSONObjectで15桁以上の大きな数を扱う場合はgetLong()の精度に要注意

「おきめっど」アプリのandroid版を開発中に思わぬバグに遭遇。
調べていくとJSONObject形式のデータからgetLong()で取得した際に値が変ってしまっていました。

元のJSONデータ:

{"elem":2,"kjid":"3144088035467509137","btst":203}

getLong()で取得した値:

3144088035467509248

androidの英文リファレンスにはValueOf(String)を用いて2段階で変換すると記載されており、つまりいったん倍精度浮動小数に変換してからlong型になるとあります。倍精度浮動小数の実数部分は52bitしかありませんので、10進数で15桁以上の値をgetLong()で取得すると上記のように誤差が発生してしまい、正しい結果が得られないというわけでした。

回避策としてgetString()で文字列として取得したのちLong.parseLong(String)等でlong型に変換する必要があります。

意外な落とし穴がありますね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)