Ios NSDictionary中的SBJSON浮点写入NSString不正确
我在一个项目中使用SBJSON,我试图从字典中构建一个json字符串 下面是发生的事情,我将浮动作为NSnumber放入字典:Ios NSDictionary中的SBJSON浮点写入NSString不正确,ios,nsstring,nsdictionary,sbjson,Ios,Nsstring,Nsdictionary,Sbjson,我在一个项目中使用SBJSON,我试图从字典中构建一个json字符串 下面是发生的事情,我将浮动作为NSnumber放入字典: NSDictionary* tempdic = [[NSDictionary alloc] init]; tempdic = [NSDictionary dictionaryWithObjectsAndKeys:productId, @"productId", [NSNumber numberWithFloat:quantity], @"aantal", price,
NSDictionary* tempdic = [[NSDictionary alloc] init];
tempdic = [NSDictionary dictionaryWithObjectsAndKeys:productId, @"productId", [NSNumber numberWithFloat:quantity], @"aantal", price, @"price" , nil];
[orders addObject:tempdic];
NSDictionary* json = [NSDictionary dictionaryWithObjectsAndKeys: orders, @"order", message, @"message", [NSNumber numberWithFloat:orderprice], @"totalPrice",dueDate,@"dueDate", nil];
最后,为了将其写成json字符串,我尝试了以下三种方法
(一)
(二)
(三)
每一个都将0.95更改为0.95000000000000034355,甚至更糟的是0.949999999992344或类似的值
为什么会这样?我怎样才能防止这种情况?
谢谢这是浮点值的基本问题。不能存储不能用
2
的幂和表示的值。从而得到与浮点值近似的值
e、 g.1.25
可以很容易地表示为2
i、 e.
1*2^0+1*2^-2
但是如果你将1.33
表示为2
的幂和,那么结果将是1*2^0+1*2^-2+1*2^-4+1*2^-8+1*2^-9.
只要在维基上阅读即可。您可以检查浮点表示。这是浮点数的经典问题。但是,您可以使用
NSDecimalNumber
而不是NSNumber
来获得更高的精度(以降低数字范围为代价) 当您再次将其转换回浮点时,它将显示.95
,或者当您将其转换为字符串时,使用%.2f,这样它将给出小数点后的2位数。json文件将发送到服务器,并在服务器上再次解析。那么服务器必须正确地将其舍入?我只是想知道应用程序中是否有这样做的方法。这些东西永远都在那里,所以不需要做任何事情。只需按原样传递这些值。假设您的服务器/应用程序将字符串0.949999999999992344
转换为0.95
,因为这是一个浮点值,所以您的服务器/应用程序将再次将这些值存储到浮点变量,从而产生相同的值0.949999999992344
。此外,这些进动损失非常小,不会影响您的数据。除非你继续乘,否则你的精度损失会越来越大。
NSData* jsonData = [writer dataWithObject:json];
NSString* jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSString* jsonString = [json JSONRepresentation];
NSString* jsonString = [writer stringWithObject:json];