所以我正在用 C 制作一個基本的銀行程式,并有一個接受雙精度的存款函式,所以我想處理來自用戶的輸入,作為雙精度有效的貨幣,保留 2 位小數且不小于 0。
解決這個問題的最佳方法是什么?到目前為止我有這個,還有什么我需要檢查金錢驗證或可以用更少的代碼行完成的任何事情嗎?謝謝
// allow user to deposit funds into an account
try{
double amount = std::stoi(userInput); // userInput is a string
if (amount < 0)
{
throw std::invalid_argument("Amount cannot be negative");
}
// call function to deposit
std::cout << "You have deposited " << amount << " into your account." << std::endl;
}
catch(std::invalid_argument){
std::cout << "Invalid input." << std::endl;
}
uj5u.com熱心網友回復:
你永遠不應該使用雙精度或浮點數來存盤這些型別的資訊。原因是浮動和雙打并不像看起來那么準確。
這是 0.1 在二進制中的樣子:
>>> 0.1
0.0001100110011001100110011001100110011001100110011...
這是一個如何將 0.1 存盤在浮點數中的示例。這是由于洗掉了...11001100...的無限個小數位引起的,因為我們無法存盤所有(無限個)它們:
0.1000000000000000055511151231257827021181583404541015625
所以每個浮點數或雙精度點數根本不準確。乍一看,我們看不到這一點(因為對于某些型別的利用而言,不準確度確實很小),但問題可能會累積-如果我們對這些數字進行數學運算。
銀行程式正是那種會導致問題的程式。
我可能會創建一個結構:
struct Amount {
int dollars;
int cents;
void recalculate() {
dollars = cents / 100;
cents = cents % 100;
}
};
每次需要時, recalculate() 函式會將整數轉換為“人類如何讀取它”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/372585.html
上一篇:從物件串列中列印出棋盤
