3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
使用整數(shù)數(shù)據(jù)類型(long long,long,int)或BCD(二進(jìn)制編碼的十進(jìn)制)算術(shù)庫(kù)。您應(yīng)存儲(chǔ)將顯示的最小數(shù)量的十分之一或百分之一。就是說(shuō),如果您使用美元并以美分(百分之一美元)表示,則您的數(shù)值應(yīng)為代表毫或毫的整數(shù)(十分之一或百分之一)。額外的重要數(shù)字將確保您的興趣和類似的計(jì)算始終如一。
如果使用整數(shù)類型,請(qǐng)確保其范圍足夠大以處理關(guān)注的數(shù)量。

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
最好的貨幣/貨幣表示形式是使用諸如doublehas 那樣的精度更高的浮點(diǎn)類型FLT_RADIX == 10。這些平臺(tái)/編譯器是罕見的,因?yàn)榻^大多數(shù)系統(tǒng)都有FLT_RADIX == 2。
四種選擇:整數(shù),非十進(jìn)制浮點(diǎn)數(shù),特殊十進(jìn)制浮點(diǎn)數(shù),用戶定義的結(jié)構(gòu)。
整數(shù):常見的解決方案是使用所選貨幣的最小面額的整數(shù)計(jì)數(shù)。以美分代替美元為例。整數(shù)的范圍必須合理地寬。喜歡的東西long long,而不是int因?yàn)閕nt只能處理大約+/- $ 320.00。這對(duì)于涉及加/減/復(fù)數(shù)的簡(jiǎn)單會(huì)計(jì)任務(wù)效果很好,但是開始會(huì)被除以利息計(jì)算中的除法和復(fù)雜函數(shù)。每月付款方式。有符號(hào)整數(shù)數(shù)學(xué)運(yùn)算沒有溢出保護(hù)。四舍五入結(jié)果時(shí)應(yīng)加倍小心。 q = (a + b/2)/b還不夠好。
二進(jìn)制浮點(diǎn)數(shù):2個(gè)常見的陷阱:1)使用float它經(jīng)常精度不足,并且2)舍入不正確。double對(duì)于許多會(huì)計(jì)限制,使用井解決了問題1。然而,代碼仍然經(jīng)常需要使用四舍五入到所需的最小貨幣單位以獲得令人滿意的結(jié)果。
// Sample - does not properly meet nuanced corner cases.
double RoundToNearestCents(double dollar) {
return round(dollar * 100.0)/100.0;
}
一種變化double是使用double最小單位的數(shù)量(0.01或0.001)。一個(gè)重要的優(yōu)點(diǎn)是能夠通過使用round()本身滿足特殊情況的函數(shù)來(lái)簡(jiǎn)單地四舍五入。
特別十進(jìn)制浮點(diǎn) 某些系統(tǒng)提供了一個(gè)“小數(shù)”類型以外的其他double符合 DECIMAL64或類似的東西。盡管這可以解決上述大多數(shù)問題,但是卻犧牲了可移植性。
用戶定義的結(jié)構(gòu)(如定點(diǎn))當(dāng)然可以解決所有問題,只是它很容易出錯(cuò),并且很容易工作(取而代之)。結(jié)果可能會(huì)完美運(yùn)行,但缺乏性能。
結(jié)論這是一個(gè)很深的主題,每種方法都應(yīng)該進(jìn)行更廣泛的討論。普遍的答案是:沒有通用的解決方案,因?yàn)樗蟹椒ǘ加忻黠@的弱點(diǎn)。因此,這取決于應(yīng)用程序的細(xì)節(jié)。
[編輯]
給定OP的其他編輯,建議使用double最小貨幣單位的編號(hào)(例如:$ 0.01-> double money = 1.0;)。每當(dāng)需要精確值時(shí),請(qǐng)?jiān)诖a中的各個(gè)位置使用round()。
double interest_in_cents = round(
Monthly_payment(0.07/12 /* percent */, N_payments, principal_in_cents));
我的水晶球說(shuō),到2022年,美國(guó)將下降0.01美元,最小單位為0.05美元。我將使用能夠最好地應(yīng)對(duì)這一轉(zhuǎn)變的方法。

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果速度是您的首要考慮因素,那么請(qǐng)使用按比例縮放到您需要代表的最小單位的整數(shù)類型(例如,磨機(jī),它是0.001美元或0.1美分)。因此,123456代表$123.456。
這種方法的問題是數(shù)字可能用完了。一個(gè)32位無(wú)符號(hào)int可以表示10個(gè)十進(jìn)制數(shù)字,因此在此方案下您可以表示的最大值為$9,999,999.999。如果您需要處理數(shù)十億美元的價(jià)值,那就不好了。
另一種方法是使用結(jié)構(gòu)類型,其中一個(gè)整數(shù)成員代表整個(gè)美元金額,另一個(gè)整數(shù)成員代表小數(shù)美元金額(同樣,縮放為您需要代表的最小單位,無(wú)論是美分,米爾斯還是其他較小),類似于timeval在一個(gè)字段中節(jié)省整秒,而在另一字段中節(jié)省納秒的結(jié)構(gòu):
struct money {
long whole_dollars; // long long if you have it and you need it
int frac_dollar;
};
一個(gè)int是更比寬足以應(yīng)付任何縮放理智的人會(huì)使用。如果該whole_dollars部分為0,則保留它的簽名。
如果您更擔(dān)心存儲(chǔ)任意大的值,那么總是有BCD,它可以表示比任何本機(jī)整數(shù)或浮點(diǎn)類型更多的數(shù)字。
不過,代表制只是成功的一半。您還必須能夠?qū)@些類型執(zhí)行算術(shù)運(yùn)算,并且對(duì)貨幣的運(yùn)算可能具有非常特定的舍入規(guī)則。因此,在決定自己的代表時(shí),您需要考慮這一點(diǎn)。
- 3 回答
- 0 關(guān)注
- 1026 瀏覽
添加回答
舉報(bào)