【问题标题】:Rounding behavior when NSNumberFormatter reads string?NSNumberFormatter 读取字符串时的舍入行为?
【发布时间】:2012-04-20 22:06:20
【问题描述】:

我有这个示例代码:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
NSString *numberString = @"9.2";
NSNumber *number = [formatter numberFromString:numberString];
NSLog(@"String: %@, Number: %@", numberString, number);

打印出来的结果是:

String: 9.2, Number: 9.199999999999999

我不明白为什么会发生这种情况。我错过了一个设置吗?

【问题讨论】:

  • 欢迎来到浮点数的奇妙世界。最接近 9.2 的 double 实际上是 9.199999999999999289457264239899814128875732421875。
  • 看起来格式化程序正在将其转换为浮点数以创建数字......奇数
  • 因为他不用花车?
  • 嗯,奇怪的是我以前没有遇到过这个。有什么地方可以让我了解更多相关信息吗?
  • @lnafziger 什么是类型的NSNumber

标签: cocoa-touch cocoa


【解决方案1】:

根据this referenceNSNumber 可以存储任何普通的 C 数字类型。由于这是通过解析非整数获得的,因此可以选择两种类型是floatdouble,根据显示的值,选择的表示是double

由于像 9.2 这样的小数不能完全表示为 doubles,因此您会得到最接近的可表示数字。以默认精度显示,大约为小数点后 16 位。

【讨论】:

  • 感谢您提供更多信息。我知道非常大或非常小的数字存在问题,但没想到对于像这样看似平均大小的数字会出现这样的问题。无论如何,感谢您为我指明正确的方向。
  • 大小无关紧要,大多数数字不能以十进制表示 (NSDecimalNumber) 或以 2 为基数(floatdouble 使用的)精确表示。但是,不精确性通常非常小并且无关紧要(但如果确实如此,事情就会变得棘手),因此对于 99.99% 的应用程序,NSNumberNSDecimalNumber 中的至少一个可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 2019-04-30
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多