我正在構建一個應付金錢的應用程序,到目前爲止我一直在使用浮點運算,但是我已經瞭解到最好使用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。浮點數有6位小數精度,雙精度浮點數有15位。float在年薪中給出了可測量的錯誤。 – gnasher729
@ gnasher729我明白了。這個解決方案與Rainer Schwarze的答案有什麼不同?你對此有何看法? – Erik