Ios NSDictionary中的SBJSON浮点写入NSString不正确

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,

我在一个项目中使用SBJSON,我试图从字典中构建一个json字符串

下面是发生的事情,我将浮动作为NSnumber放入字典:

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];