我有一个double在NSNumber.
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.特别是我问题的一个更好的解决方案就是我在前一段中概述的内容,所以我没有采用这条路线.