【问题标题】:Using NSNumberFormatter to Display Extremely Large Numbers使用 NSNumberFormatter 显示非常大的数字
【发布时间】:2014-12-09 22:47:16
【问题描述】:

我正在为 iPhone 开发一个计算器应用程序。

在显示大于 15 位的计算结果时,我在使用 NSNumberFormatter 时遇到了问题。

例如计算结果111,111,111,111,111 x 2 = 222,222,222,222,222(正确)。但是,计算结果 1,111,111,111,111,111 x 2 = 2,222,222,222,220(错误!)。

使用NSNumberFormatter可以显示多少位数有限制,或者有人能告诉我为什么计算结果显示不正确吗??
提前致谢!

示例代码:

double absResult = fabs(_result);
NSLog(@"_result = %f", _result);
//_result is the result of the calculation that will be placed onto displayLabel below
// _result = 2,222,222,222,222,222 for the calculation 1,111,111,111,111,111 x 2

NSNumberFormatter *displayString = [[NSNumberFormatter alloc]init];

//** Adds zero before decimal point **
[displayString setMinimumIntegerDigits:1];

 [displayString setUsesGroupingSeparator:YES];
 [displayString setGroupingSeparator:@","];
 [displayString setGroupingSize:3];

[displayString setMinimumFractionDigits:2];
[displayString setMaximumFractionDigits:2];
 NSString *resultString = [displayString stringFromNumber:[NSNumber numberWithDouble: _result]];
 self.displayLabel.text = resultString;

【问题讨论】:

    标签: ios xcode nsnumberformatter


    【解决方案1】:

    这与NSNumberFormatter 的能力无关,只与double 浮点数的精度有关。 double 类型使用 8 个字节来存储 53 位尾数和 11 位指数。请参阅Wikipedia article

    53 位尾数太小,无法准确表示 222,222,222,222,222,因此将 double 设置为最接近的可能表示形式。

    如果您想要更高的精度,您应该尝试NSDecimalNumber,它更适合计算器应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多