Intereting Posts

Неправильный результат с использованием float для представления значений валюты

Если я использую следующий код:

- (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.

Мне бы хотелось услышать некоторые мысли о том, что происходит.

Благодаря,

Matt

EDIT: XCode сообщал 203500, когда я просматривал его с помощью отладчика, но когда я преобразовал float в NSString, он также отобразил бы 203500.018. Значение проблемы было в поплавке, а не в NSNumberFormatter.

Вы создаете NSNumber с поплавком. Поплавки всегда могут иметь ошибку округления

Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой

Вы должны ознакомиться с NSDecimals и NSDecimalNumbers

Какао – мой GF: не ленитесь с NSDecimalNumber (например, я)

Ясно, что у меня есть много, чтобы учиться на этом. Но, рискуя стать дальше, я сообщу одно, что мне помогло.

У меня был этот код:

 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]]; 

Я отношусь к тем, кто знает больше, но я думал, что, по крайней мере, упомянул, что это сработало для меня. Удачи.