我实际上正在学习C ++编程语言(我以前从未编程过)并且我正在尝试解决一个问题,我必须设计并实现一个简单的金钱类来计算涉及美元的金额。作者给出了一些关于如何实现这个类的规则:
在编码之前做了一些研究之后我发现不建议使用双重类型的金额,而且我应该整数。我的问题是如何读取double作为输入并将其转换为long int而不会丢失数据?我应该使用其他方式/类型来做到这一点吗?我应该将long int(代表美分)作为构造函数参数直接用于此类吗?我一直在寻找,但我发现很多关于可能丢失数据的信息让我很困惑。这是一个初学练习,所以我认为计算不应该非常精确。谢谢
答案 0 :(得分:1)
我们假设输入格式正确。
也就是说,您收到的所有金额都将采用
的形式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;
有了这么多想法之后,你可以开始让你的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));
}
从那里你可以继续提高输入的稳健性。如果有两个小数位怎么办?如果输入中有字符怎么办?
我建议您编写几个测试来测试尽可能多的输入可能性,假设是最愚蠢的,大多数计算机文盲的用户。你应该如何处理无效输入?要求更多,抛出异常,使用默认值并打印警告?所有这些都是您在处理用户输入时将来做出的决定。
编辑: 解决你的最后一点
算术运算需要使用4/5舍入规则精确到最后一分。
这一般不会太困难,只是单调乏味。你将遇到的最大障碍是分裂。此时,您需要非常小心整数舍入。那就是:
2/1
将生成0
,而非0.5
。
不应该实施乘法和除法运算,因为它们没有意义。搜索网络,了解如何使用整数除法进行精确舍入。