2010-08-06 29 views
2

noob這裏想要計算iPhone上的複利。客觀C數學公式失敗

float principal; 
float rate; 
int compoundPerYear; 
int years; 
float amount; 

公式應該是:金額=本金*(1種+速度/ compoundPerYear)^(費率*年)

我得到稍微不正確的答案有:

amount = principal*pow((1+(rate/compoundPerYear)), (compoundPerYear*years)); 

我測試它的速率爲.1,但調試器報告.100000001。

我做錯了嗎?我應該使用雙打還是特殊類別(例如NSNumber)?

感謝您的任何其他想法!


經過進一步研究似乎NSDecimalNumber類可能正是我需要的。現在我只需要弄清楚如何使用這個壞男孩。

+0

看到我的答案http://stackoverflow.com/questions/1415536​​0/convert-to-float-and-calculate/14155699#14155699可能會有所幫助:) – TheTiger 2013-01-05 08:04:22

回答

5

double會讓你更接近,但你不能完全用二進制表示1/10(無論如何使用IEEE浮點表示法)。

如果你真的感興趣,你可以看看What Every Computer Scientist Should Know About Floating-Point Arithmetic。鏈接從另一個SO線程中被無恥地竊取。

快速而骯髒的解釋是,浮點以二進制形式存儲,代表2的分數冪(1/2,1/4,1/8,...)。根本沒有數學方法將這些分數加到1/10,因此0.1不能用IEEE浮點表示法精確表示。

double通過在基數之前/之後給予更多數字來擴展數字的準確性,但它不會以可以彌補這一點的方式更改二進制格式。你很可能會在稍後的某個地方獲得額外的位。

參見:

和其他類似的線程。


,我尋思着在開車回家,從工作的進一步擴展:那麼你可以想象處理這是剛剛代表美分所有貨幣價值(作爲int)的一種方式,轉換爲美元。美分格式顯示數據時。這其實是很容易的,也因爲您可以在轉換利用整數除法的截斷的:

int interest, dollars, cents; 
interest = 16034; //$160.34, in cents 
dollars = value/100; //The 34 gets truncated: dollars == 160 
cents = value % 100; //cents == 34 
printf("Interest earned to date: $%d.%d\n", dollars, cents); 

我不知道的Objective-C,但希望該C例子是有道理的,太。再次,這只是處理它的一種方式。它還可以通過一個函數在需要顯示數據時進行字符串格式化來改進。

顯然你可以想出自己的(甚至更好!)方式來做到這一點,但也許這會幫助你開始。如果其他人對此有任何建議,我也想聽聽他們的意見!

+0

感謝您的回覆。我希望我能得到時間(和大腦)閱讀每臺計算機。 。 。這些日子之一,但它的一開始是有幫助的。 您提出的僅限於美分計劃是巧妙的,但對我來說太困惑了。它會與百分比,乘法,指數,對數等一起工作嗎? – alrightSpider 2010-08-06 23:54:24

+0

它可以工作,是的。主要優點是您可以少擔一個浮點數。即使您使用NSDecimalNumber來表示費率,最終可能會更容易將貨幣值留爲美分。然後,您可以在任何可能的情況下執行整數算術運算(例如將兩筆金額加在一起)。如果NSDecimalNumber對於你的計算來說足夠精確,那麼儘管如此,完全有意義。再次,我不是一個客觀的C傢伙:) – eldarerathis 2010-08-07 01:14:56

+1

恕我直言,會計和浮點混合只有巨大的照顧和考慮。我的理解是,已經建立了最佳實踐,瞭解它們並遵循它們是一個好主意。一個好的第一步是從美分而不是美元開始工作。如果您仍然需要浮點值類型,那麼切換到以10爲基數而不是以2爲基數的值可以提供幫助。這只是非常大的問題冰山一角。 – RBerteig 2010-08-07 01:34:01

1

簡短回答:從不使用浮點數的金錢。

在大多數平臺上工作的簡單方法是將貨幣表示爲整數量的最小單位。最小的單位通常是一分錢,雖然通常1/10或1/100的百分之一是真正的基本單位。

在許多平臺上,還有可用數字類型表示定點小數。

一定要弄清楚權利。財務簿記經常使用銀行家的四捨五入。