簡體   English   中英

NSDecimalNumber用於財務

[英]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:0910:10 ,人們會感到奇怪,為什么在第一種情況下金額幾乎為零。

如果您需要非常准確,則很難進行財務和時間計算。 因此,可以歸結為:首先找出您需要的精度。 (請注意,“准確”在進入法規,法律等領域時可能具有怪異的含義和含義。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM