ios開發(fā)中,在接收后臺數(shù)據(jù)的時候會先轉(zhuǎn)換為對象,最后轉(zhuǎn)化為我們想要的數(shù)據(jù)類型.
那么數(shù)字是怎么樣的一個過程呢??
后臺傳給我們一個數(shù)字,后臺可以定義為 Number類型,也可以定義成 String類型.當(dāng)后臺返回來一個NSString類型,在iOS json序列化的時候,會把字符串類型轉(zhuǎn)化為NSString對象.當(dāng)后臺傳給我們的是number類型,我們拿到j(luò)son數(shù)據(jù)后,會把數(shù)據(jù)轉(zhuǎn)化成NSNumber對象類型,使用的時候會把NSNumber轉(zhuǎn)化為我們想要的類型.
但是接收數(shù)據(jù)的時候,我們需要把number轉(zhuǎn)化為NSString類型,會出現(xiàn)轉(zhuǎn)化不準(zhǔn)確的現(xiàn)象,比如后臺定義了一個82.4,我們接收到數(shù)據(jù),并轉(zhuǎn)化為NSString類型,結(jié)果會顯示出82.39999999999999999.試過幾次后發(fā)現(xiàn)是double轉(zhuǎn)化為NSNumber的時候除了問題.double表示的字面值和其存儲的值一般是不一樣的,轉(zhuǎn)化為NSNumber之后,有很大一些數(shù)字,在NSNumber的stringValue上會出錯。
解決方法:可以是取String的doubleValue,然后再.2f保留兩位小數(shù)進(jìn)行構(gòu)造字符串。千萬不能取floatValue,floatValue在大于15萬的浮點(diǎn)數(shù)字就會出現(xiàn)不精確了 。而doubleValue在數(shù)十億的范圍內(nèi)都是字面上精確的。
根本解決方法還是讓后臺的同事把請求返回的數(shù)據(jù)全部設(shè)置為String類型
如果涉及到計(jì)算的問題,那就只得乖乖轉(zhuǎn)化為NSDecimalNumber對象了。
在開發(fā)中,關(guān)于價(jià)格金額的計(jì)算往往是比較嚴(yán)格的,試想一下,支付寶每次轉(zhuǎn)錢的時候,少轉(zhuǎn)了1分錢,你會開心嗎?
在顯示金額的時候,最后這些數(shù)據(jù)都由后臺確定,移動端直接顯示,不要進(jìn)行轉(zhuǎn)換.如果必要的時候,真的需要進(jìn)行計(jì)算,請使用NSDecimalNumber來進(jìn)行計(jì)算,這是這是一個高精度的類,專門用于計(jì)算金額.