我們假設輸入格式良好。
也就是說,您收到的所有貨幣金額將在
99.99
形式,其中9
符號可以是0到9之間的任意數字。在小數點的左邊,只有數字,範圍將足夠小以便存儲在int
內。
小數點右側(並且總是有小數點)始終是一個正數,也適用於int
。
您可以創建一個非常簡單的結構來表示的貨幣金額,分離塊錢到一個int
,並美分到另一個:
struct Money
{
int dollars;
int cents;
};
在量讀書,你首先會在dollars
場讀取。然後你會閱讀.
。然後你會在cents
場閱讀:
Money m;
char c;
std::cin >> m.dollars >> c >> m.cents;
Live Demo
你有這麼多想通了之後,你就可以開始讓你的I/O更強勁,操控那裏沒有小數點的情況下,或者有人投入了很多。在這一點上,它可能是合理的第一次讀入std::string
讓你的錢的文字表述,並從那裏解析string
:
Money m{0,0};
std::string text;
std::getline(std::cin, text);
std::cout << "Input was: " << text << std::endl;
// is there a decimal point?
size_t decimal_point_position = text.find_first_of('.');
m.dollars = stoi(text.substr(0, decimal_point_position));
if (decimal_point_position != std::string::npos)
{
decimal_point_position += 1;
m.cents = stoi(text.substr(decimal_point_position, text.size() - decimal_point_position));
}
Demo2
並從那裏你可以繼續提高輸入的健壯性。如果有兩位小數呢?如果輸入中有字符怎麼辦?
我建議你寫幾個測試來測試儘可能多的輸入可能性,假設最愚蠢的,大多數計算機不識字的用戶。你應該如何處理無效輸入?請求更多,拋出異常,使用默認值並打印警告?所有這些都是您將來在處理用戶輸入時做出的決定。
編輯: 爲了解決您的最後一點
算術運算需要精確到使用4/5四捨五入規則的最後一分錢。
這一般不會太困難,只是單調乏味。你遇到的最大障礙將是分裂。在這一點上,你需要非常小心整數舍入。即:
2/1
將產生0
,而不是0.5
。
乘法和除法操作不應該執行,因爲它們沒有意義。搜索網頁,瞭解如何使用整數除法精確進行圓整。
一旦你閱讀**雙**,你已經失去了數據。通常情況下,您可以將它「四捨五入」(典型方法是乘以100,然後將其四捨五入爲整數)。您應該這樣做,或者以字符串的形式讀取,並將它自己解析爲無損數據模型。 – MariusSiuram