2

如果我使用以下代码:

- (NSString*)formatToCurrency:(float)inFloat {
  NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
  [currencyFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
  [currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
  [currencyFormatter setMaximumFractionDigits:2];
  [currencyFormatter setLocale:[NSLocale currentLocale]];

  NSNumber *x = [NSNumber numberWithFloat:inFloat];
  return [NSString stringWithFormat:@"  %@", [currencyFormatter stringFromNumber:x]];
}

然后在调用代码时传入 203500,我收到输出:$203,500.02。

我很想听听关于正在发生的事情的一些想法。

谢谢,

马特

编辑:当我用调试器查看它时,XCode 报告了 203500,但是当我将浮点数转换为 NSString 时,它也会显示 203500.018。这意味着问题出在浮点数中,而不是在 NSNumberFormatter 中。

4

2 回答 2

6

您正在使用浮点数创建 NSNumber。浮点数总是会有舍入误差

每个计算机科学家都应该知道的关于浮点运算的知识

你应该熟悉NSDecimalsNSDecimalNumbers

Cocoa 是我的 GF:不要对 NSDecimalNumber 偷懒(像我一样)

于 2012-11-04T21:20:47.430 回答
0

显然,我在这方面有很多东西要学。但冒着被进一步抨击的风险,我会报告一件对我有帮助的事情。

我有这个代码:

self.myDollarFormat.roundingIncrement = [NSNumber numberWithFloat:roundingInc];
return [self.myDollarFormat stringFromNumber:[NSNumber numberWithFloat: dollars]];

并发现 638198.2 的 roundingIncrement 为 0.1 产生 @"$638,198.21"。

我将代码更改为使用 double 而不是 float,然后得到了预期的结果。

self.myDollarFormat.roundingIncrement = [NSNumber numberWithDouble: roundingInc];
return [self.myDollarFormat stringFromNumber:[NSNumber numberWithDouble: dollars]];

我尊重那些了解更多的人,但我想我至少会提到这对我有用。祝你好运。

于 2012-11-04T23:14:43.300 回答