iOS解析json 浮點型資料,精度丟失問題

2021-09-11 13:31:57 字數 1985 閱讀 1964

服務端傳遞回來的是 保留小數點兩位的浮點型,ios端解析後,發現 取出欄位的doublevalue後 精度丟失,小數點後多了很多位

原值 71.20

解析後 71.199997

複製**

原始資料

複製**

#import "nsnumbertest.h"

nsstring const * kbigdecimalnumberconst = @"bigdecimalnumber";

nsstring const * kbigdecimalstringconst = @"bigdecimalstring";

@implementation nsnumbertest

+ (nsstring *)valueofnsnumber:(nsnumber *)number

+ (id)loadlocaljsonfile

nslog(@"json格式不對");

return nil;

} nslog(@"\n%@", [error localizeddescription]);

return nil;

}+(nsstring *)testjsondictnumber

if ([result iskindofclass:[nsdictionary class]]) else

if ([number iskindofclass:[nsstring class]]) else

nslog(@"------------------------測試字串型別------------------------");

nsstring *string = [dict objectforkey:kbigdecimalstringconst];

if ([string iskindofclass:[nsnumber class]]) else

if ([string iskindofclass:[nsstring class]]) else

return [result description] ;

} else

if ([result iskindofclass:[nsarray class]])

return @"";

}@end

複製**

列印資訊

+[nsnumbertest testjsondictnumber]

這是乙個合格的json:

------------------------測試數值型別------------------------

傳遞的是數值,注意json不區分 整數還是浮點數

+[nsnumbertest valueofnsnumber:]

number: 71.2

doublevalue: 71.200000

doublevalue - 2: 71.20

floatvalue: 71.199997

floatvalue-2: 71.20

strin**alue: 71.2

------------------------測試字串型別------------------------

傳遞的是字串: 71.20

字串轉換成數值: 71.200000

%f,只能接受小數點點後六位。如果要接受64位的浮點型用%lf

複製**

猜測是nsnumber的問題

結論: 浮點型資料的傳輸後的ios解析 直接轉換成數值,不論是float 還是double都會有精度的變化. 那麼我們在傳遞過程中就要規定數值保留小數點幾位來完整表達數值的精確.

而移動端一般只是進行顯示,最好的處理方式就是 傳遞字串. 這樣不論 安卓還是ios 都不會有處理上的不同.

IOS中JSON資料解析

官方為我們提供的解析json資料的類是 nsjsonserialization,首先我們先來看下這個類的幾個方法 bool isvalidjsonobject id obj 判斷乙個資料物件是否可以轉化為json資料 nsdata datawithjsonobject id obj options ...

iOS中JSON資料解析

使用方法 nsdictionary testdic nsdictionary alloc initwithobjectsandkeys 0 result 1020 bizcode success data nil nslog testdic testdic nserror error nsdata ...

浮點型資料

浮點型資料是用來表示具有小數點的實數的。為什麼在c中把實數稱為浮點數呢?在c語言中,實數是以指數形式存放在儲存單元中的。乙個實數表示為指數可以有不止一種形式,如3.14159可以表示為 3.14159 10e0,0.314159 10e1,0.0314159 10e2,31.4159 10e 1,3...