3 回答

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

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

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