2011-06-11 62 views
1

我有兩個NSDate實例(一個開始時間和一個結束時間),還有一個NSDecimalNumber(它代表兩個日期之間的時間段內獲得的金額)。我想要做的是根據這三個變量計算小時費率。我想出了一些可行的方法,但是感覺有點過分,我想知道是否有更簡單,更有效的方法。這就是我現在正在做的。Objective-C:使用NSDate和NSDecimalNumber計算小時費率

計算

NSTimeInterval timeInSeconds = [endTime timeIntervalSinceDate:startTime]; 

兩個NSDates之間的時間量轉換成小時

double hours = timeInSeconds/3600; 

轉換的時間這雙入一個NSNumber

NSNumber *duration = [NSNumber numberWithDouble:hours]; 

轉換所述的NSNumber成NSString

NSLocale *locale = [NSLocale currentLocale]; 
NSString *durationString = [duration descriptionWithLocale:locale]; 

使用這個字符串創建一個NSDecimalNumber

NSDecimalNumber *decimalDuration = [NSDecimalNumber decimalNumberWithString:durationString locale:locale]; 

通過時間

NSDecimalNumber *hourlyRate = [result decimalNumberByDividingBy:decimalDuration]; 

這個新NSDecimalNumber表示將原始NSDecimalNumber(結果)如果我理解正確的,唯一的方式來做任何涉及我的原始NSDecimalNumber的數學是創建NSDecimalNumber的另一個實例,所以有必要經歷所有這些步驟。我擔心我可能會失去準確性或執行不必要的步驟。感謝您的任何建議。

回答

1

爲什麼你不使用簡單的數學?

NSTimeInterval timeInSeconds = [endTime timeIntervalSinceDate:startTime]; 
double hours = timeInSeconds/3600; 
double rate = [result doubleValue]; 
double hourlyRate = rate/hours; 
+0

是的,我想這會更好。我想我自己陷入了更長的路徑,因爲我試圖將hourlyRate作爲十進制核心數據瞬態值來存儲,但我相信使用你的方法會更容易,只需將其存儲爲一個包含在NSNumber中的double。謝謝你, – 2011-06-11 06:31:31

+0

@Mark Leonard,很高興幫助你:-) – EmptyStack 2011-06-11 07:05:45

+1

@Mark:如果你正在做多個嚴重的貨幣計算,你會想要堅持十進制數,因爲你會失去精度,然後雙精度。不過,做一個涉及金錢的分裂步驟應該沒問題。 – 2011-06-11 09:37:18