Я создаю приложение, которое имеет дело с деньгами, и до сих пор я использую арифметику с плавающей запятой, но я узнал, что лучше использовать NSDecimalNumber.NSDecimalNumber для финансов
Я хочу, чтобы убедиться, что я правильно понял, так что здесь идет:
Представьте себе некоторый рабочий, зарабатывая 20.57 $/час. Эта информация предоставляется пользователем. Я сделал это, как это раньше:
@property (nonatomic) float hourlyRate;
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;
NSNumber *hourlyRate = [numberFormatter numberFromString:self.rateTextField.text];
settingsObject.hourlyRate = [hourlyRate floatValue];
Но Я теперь изменил его:
@property (nonatomic) NSDecimalNumber *hourlyRate;
settingsObject.hourlyRate = (NSDecimalNumber *)[NSDecimalNumber decimalNumberWithString:self.rateTextField.text locale:[NSLocale currentLocale]];
Это правильный способ чтения NSDecimalNumbers из строки?
Скажите, что этот человек входит на рабочее место в 10:01. Я сохранить эту информацию следующим образом:
[[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"start"];
После того, как человек закончил, время начала читать NSUserDefaults так:
NSDate *start = [[NSUserDefaults standardUserDefaults] objectForKey:@"start"];
Продолжительность рассчитывается следующим образом:
NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:start]/3600;
NSDecimalNumber *earned = [settingsObject.hourlyRate decimalNumberByMultiplyingBy:[[NSDecimalNumber alloc] initWithFloat:interval]];
Это правильный и эффективный способ, сохраняя точность?
Спасибо!
Не используйте поплавок, используйте двойные. float имеет шестую десятичную точность, double имеет 15. float дает измеримые ошибки в годовой оклад. – gnasher729
@ gnasher729 я вижу. Насколько хорошо это решение работает против ответа Райнера Шварца? Каково ваше мнение по этому поводу? – Erik