3 回答

TA貢獻1859條經(jīng)驗 獲得超6個贊
不要將其存儲為美分,因為當您快速乘以稅金和利息時會累積錯誤。至少要保留兩個有效數(shù)字:$ 12.45將被存儲為124,500。如果將其保留為帶符號的32位整數(shù),則可以使用$ 200,000(正數(shù)或負數(shù))。如果您需要更大的數(shù)字或更高的精度,則帶符號的64位整數(shù)可能會為您提供長時間所需的所有空間。
將這個值包裝在一個類中,為您提供一個位置來創(chuàng)建這些值,對其進行算術(shù)并格式化它們以便顯示,可能會有所幫助。這也將使您可以集中存放所存儲的貨幣(美元,加元,歐元等)。

TA貢獻1847條經(jīng)驗 獲得超11個贊
在實際的金融系統(tǒng)中處理了這個問題之后,我可以告訴您,您可能想使用精度至少為小數(shù)點后6位(假設美元)的數(shù)字。希望由于您在談論貨幣價值,所以不會對您造成太大的影響。有建議為C ++添加十進制類型,但我不知道實際上有沒有十進制類型。
在這里使用的最佳本機C ++類型將是long double。
其他僅使用int的方法的問題在于,您必須存儲的不僅是美分。通常,金融交易會乘以非整數(shù)值,這會給您帶來麻煩,因為$ 100.25轉(zhuǎn)換為10025 * 0.000123523(例如APR)會引起問題。您最終將最終陷入浮點土地,而轉(zhuǎn)換將花費您很多錢。
現(xiàn)在,在大多數(shù)簡單情況下都不會發(fā)生此問題。我給你一個精確的例子:
給定幾千種貨幣值,如果您將每個貨幣值乘以一個百分比然后相加,那么如果您沒有保留足夠的小數(shù)位數(shù),則最終得出的數(shù)字將不同于將總數(shù)乘以該百分比所得到的數(shù)字。現(xiàn)在,這在某些情況下可能會起作用,但是您很快就會掉價幾分錢。根據(jù)我的一般經(jīng)驗,請確保您將精度保持在小數(shù)點后6位(確保剩下的精度可用于整數(shù)部分)。
還應了解,如果以不太精確的方式進行數(shù)學運算,則存儲哪種類型都沒有關(guān)系。如果您的數(shù)學是在單精度范圍內(nèi)完成的,則以雙精度存儲它并不重要。對于最不精確的計算,您的精度將是正確的。
話雖如此,如果您不做簡單的加法或減法運算,然后存儲數(shù)字,那您就可以了,但是一旦出現(xiàn)任何比這更復雜的事情,您就會遇到麻煩。

TA貢獻1757條經(jīng)驗 獲得超8個贊
最大的問題是四舍五入!
42,50€的19%= 8,075€。根據(jù)德國四舍五入規(guī)則,這是8,08€。問題是,(至少在我的機器上)8075不能表示為double。即使我將調(diào)試器中的變量更改為該值,我最終也會得到8,0749999 ....
這就是我的舍入函數(shù)(以及我能想到的任何其他浮點邏輯)失敗的地方,因為它產(chǎn)生8,07€。有效數(shù)字為4,因此該值四舍五入。這是很明顯的錯誤,除非您避免使用浮點值,否則您將無能為力。
如果您將42,50€表示為Integer 42500000,則效果很好。
42500000 * 19/100 =8075000。現(xiàn)在您可以將舍入規(guī)則應用到8080000以上。由于顯示原因,可以很容易地將其轉(zhuǎn)換為貨幣值。8,08€。
但是我總是將其包裝在一個類中。
- 3 回答
- 0 關(guān)注
- 413 瀏覽
添加回答
舉報