「おきめっど」アプリの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型に変換する必要があります。
意外な落とし穴がありますね。