如果我使用以下代码:
- (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中。答案 0 :(得分:6)
您正在使用浮点数创建NSNumber。浮点数总是会出现舍入错误
What Every Computer Scientist Should Know About Floating-Point Arithmetic
您应该熟悉NSDecimals和NSDecimalNumbers
Cocoa is my GF: Don't be lazy with NSDecimalNumber (like me)
答案 1 :(得分:0)
显然,我有很多需要学习的东西。但是冒着被进一步发展的风险,我会报告一件对我有帮助的事情。
我有这段代码:
self.myDollarFormat.roundingIncrement = [NSNumber numberWithFloat:roundingInc];
return [self.myDollarFormat stringFromNumber:[NSNumber numberWithFloat: dollars]];
发现638198.2,舍入增量为0.1,产生了@“$ 638,198.21”。
我将代码更改为使用double而不是float,然后我得到了预期的结果。
self.myDollarFormat.roundingIncrement = [NSNumber numberWithDouble: roundingInc];
return [self.myDollarFormat stringFromNumber:[NSNumber numberWithDouble: dollars]];
我尊重那些了解更多的人,但我想我至少会提到这对我有用。祝你好运。