3 回答

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

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

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