[英]NSDecimalNumber for finances
我正在構建一個處理金錢的應用程序,並且到目前為止,我一直在使用浮點運算,但是我了解到最好使用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]];
這是正確且最有效的方法,同時又能保持精度嗎?
謝謝!
這是從字符串讀取NSDecimalNumbers的正確方法嗎?
是。 但是,您不需要強制轉換結果。 所以它應該看起來像這樣:
settingsObject.hourlyRate = [NSDecimalNumber decimalNumberWithString:self.rateTextField.text locale:[NSLocale currentLocale]];
除非您使用的是非當前語言環境,否則不需要NSLocale
部分:
settingsObject.hourlyRate = [NSDecimalNumber decimalNumberWithString:self.rateTextField.text];
我認為此函數不喜歡nil值,因此您需要確保rateTextField
具有非nil值:
if ([self.rateTextField hasText]) {
settingsObject.hourlyRate = [NSDecimalNumber decimalNumberWithString:self.rateTextField.text];
}
else {
settingsObject.hourlyRate = [NSDecimalNumber zero];
}
這是正確且最有效的方法,同時又能保持精度嗎?
是的,您將間隔轉換為NSDecimal數,然后對我來說乘法看起來不錯。
首先,您需要針對以下問題的答案:
您想達到的准確度-還是您需要達到的准確度?
您的應用會生成發票還是作為發票的基礎? 如果是,則可能必須遠離浮點數。 您可能還需要考慮在計算中實際使用持續時間的方式。 某些業務領域或專業可能有規定,這些規定定義了如何度量/開具發票時間。
不太准確:
如果您不需要非常准確,我會繼續使用浮點數,直到遇到障礙為止。
准確:
1.金錢:
將錢存儲為整數(分)。
2.時間:
確定時隙並將其存儲為整數(可能是分鍾)。
3.計算:
使用整數進行計算。 切勿使用浮子。
細節:
當您輸入25.07
(我使用了不同於20.57的數字來解釋美分渲染),則將其存儲為2507
。 用美分來計算。 用於顯示轉換為$
或$/hrs
。 例如:
int amount = 2507;
int amountDollars = amount / 100;
int amountCents = amount % 100;
NSString *output = [NSString stringWithFormat:@"%d.%02d $/hrs", amountDollars, amountCents];
NSLog(@"output = %@", output);
// prints:
// output = 25.07 $/hrs
對於時間,請選擇合適的基本單位(分鍾/秒/五分鍾/十分鍾/半小時?)並將其存儲為整數。
假設您以10分鍾為單位開票。 您可能會在接下來的10分鍾開始計費。 因此,如果記錄中有11分鍾,則必須計算20分鍾。 在幾分鍾內存在類似的問題-假定這些值:
Actual Time | "Integer Time"
10:09:59 | 10:09
10:10:01 | 10:10
Difference:
00:00:02 | 00:01
如果僅使用帶浮點數的實際時間,則第一個差異幾乎等於零,第二個差異等於一分鍾。 如果您的時間在報告中顯示為10:09
和10:10
,人們會感到奇怪,為什么在第一種情況下金額幾乎為零。
如果您需要非常准確,則很難進行財務和時間計算。 因此,可以歸結為:首先找出您需要的精度。 (請注意,“准確”在進入法規,法律等領域時可能具有怪異的含義和含義。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.