android使用JSON遇到的坑(1)

最近在開發(fā)的過程中遇到一個問題碍拆,服務(wù)端返回了一個JSON對象,在用JSON庫解析的時候出現(xiàn)了一個詭異的問題
服務(wù)端返回的原始JSON是

{
    "value": "15493409528126467"
}

在程序中直接調(diào)用JSON中的方法

jsonObject.optLong("value");

打印的日志如下

origin value=15493409528126467
parse value=15493409528126468

通過JSON的方法取到的結(jié)果出現(xiàn)了不一致的情況瓮孙。應(yīng)該是轉(zhuǎn)換的時候精度出現(xiàn)了損失赃阀,一步一步跟到內(nèi)部的實現(xiàn)方法,先看optLong()

public long optLong(String name) {
    return optLong(name, 0L);
}

這里調(diào)用了兩個參數(shù)的optLong()方法钾菊,在不傳默認值的時候如果出錯的話這個方法會返回0溃槐。再往里跟匣砖,這個方法內(nèi)部調(diào)用了JSON.toLong()方法。

public long optLong(String name, long fallback) {
    Object object = opt(name);
    Long result = JSON.toLong(object);
    return result != null ? result : fallback;
}

接著向里面走

static Long toLong(Object value) {
    if (value instanceof Long) {
        return (Long) value;
    } else if (value instanceof Number) {
        return ((Number) value).longValue();
    } else if (value instanceof String) {
        try {
            return (long) Double.parseDouble((String) value);
        } catch (NumberFormatException ignored) {
        }
    }
    return null;
}

看來問題是出在這里了昏滴,當輸入的參數(shù)為String的時候猴鲫,toLong()方法會使用Double.parseDouble()方法解析,而我們知道double的精度是會有損失的谣殊,在Google的文檔上有這么一句話

When the requested type is a long, other Number types will be coerced using longValue. Strings that can be coerced using valueOf(String) will be, and then cast to long. This two-step conversion is lossy for very large values. For example, the string "9223372036854775806" yields the long 9223372036854775807.

在取非常大的數(shù)字的時候拂共,會先轉(zhuǎn)換成String,再通過parseDouble()方法轉(zhuǎn)成long姻几,這期間就造成了精度損失宜狐。

解決方法

先得到String類型的值,再將String轉(zhuǎn)成long

String str = jsonObject.optString("value");
long result = Long.valueOf(str);

這樣就可以正確的取到值了鲜棠,Long.valueOf()內(nèi)部實現(xiàn)調(diào)用了BigInteger中的方法肌厨,這樣就能保證結(jié)果正確了培慌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末豁陆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吵护,更是在濱河造成了極大的恐慌盒音,老刑警劉巖表鳍,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異祥诽,居然都是意外死亡譬圣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門雄坪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厘熟,“玉大人,你說我怎么就攤上這事维哈∩蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵阔挠,是天一觀的道長飘庄。 經(jīng)常有香客問我,道長购撼,這世上最難降的妖魔是什么跪削? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮迂求,結(jié)果婚禮上碾盐,老公的妹妹穿的比我還像新娘。我一直安慰自己揩局,他們只是感情好廓旬,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谐腰,像睡著了一般孕豹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上十气,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天励背,我揣著相機與錄音,去河邊找鬼砸西。 笑死叶眉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的芹枷。 我是一名探鬼主播衅疙,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸳慈!你這毒婦竟也來了饱溢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤走芋,失蹤者是張志新(化名)和其女友劉穎绩郎,沒想到半個月后潘鲫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡肋杖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年溉仑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片状植。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡浊竟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出津畸,到底是詐尸還是另有隱情逐沙,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布洼畅,位于F島的核電站吩案,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏帝簇。R本人自食惡果不足惜徘郭,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丧肴。 院中可真熱鬧残揉,春花似錦、人聲如沸芋浮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纸巷。三九已至镇草,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瘤旨,已是汗流浹背梯啤。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留存哲,地道東北人因宇。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像祟偷,于是被迫代替她去往敵國和親察滑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容