相关疑难解决方法(0)

NSNumber使用舍入/截断的小数位数加倍

我有一个doubleNSNumber.

double myDouble = 1363395572.6129999;

NSNumber *doubleNumber = @(myDouble); 
// using [NSNumber numberWithDouble:myDouble] leads to the same result
Run Code Online (Sandbox Code Playgroud)

这是问题所在.

doubleNumber.doubleValue 似乎返回正确和完整的价值 (1363395572.6129999)

但是,查看doubleNumber调试器或做的事情doubleNumber.description给了我(1363395572.613).

我会理解,如果这只是一些显示格式,但是当我将这个对象粘贴到JSON有效载荷中时,会插入混乱的圆形值而不是实际的数字.

我这样做的方式是这样的:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:(Dictionary containing NSNumber)
                                                           options:0 error:nil];

NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

此时查看字符串会显示截断的数字,其中包含3个小数位,即使NSNumber我插入的数字为7.

我的问题是为什么会发生这种情况,更重要的是如何阻止它发生?

编辑结论:

对于任何偶然发现这个问题的人来说,问题从一开始就不清楚,但实际问题是,NSNumber并且double都无法按照我正在寻找的那种精确度来保存数字.正如Martin的回答所示,一旦我从JSON响应中反序列化初始数值,就会出现问题.

我最终通过重新处理整个系统来解决我的问题,取决于客户端上这些数字的这种精度水平(因为这些是时间戳,微秒),而是使用不同的标识符来传递API.

正如Martin和Leo指出的那样,为了解决这个问题,人们需要使用一个自定义的JSON解析器,它允许将JSON数解析成一个NSDecimalNumber而不是一个NSNumber.特别是我问题的一个更好的解决方案就是我在前一段中概述的内容,所以我没有采用这条路线.

objective-c nsnumber ios

4
推荐指数
1
解决办法
8911
查看次数

标签 统计

ios ×1

nsnumber ×1

objective-c ×1