c++ - 初学者练习 : Design a Money class

标签 c++ class currency

我实际上正在学习 C++ 编程语言(我以前从未编程过),我正在尝试解决一个问题,我必须设计和实现一个简单的货币类来进行涉及美元的计算。作者给了我一些关于如何实现这个类的规则:

  • 将货币金额表示为 long int 中的美分数。
  • 对于输入和输出,以美元和美分表示结果,例如 16.45
  • 算术运算需要使用 4/5 舍入规则精确到最后一分。

在编码之前进行一些研究后,我发现不建议将 double 类型用于货币金额,我应该使用整数。我的问题是关于如何在不丢失数据的情况下读取 double 作为输入并将其转换为 long int?我应该使用其他方式/类型来做到这一点吗?我应该直接将 long int(代表美分)作为此类的构造函数参数吗?我一直在搜索,但我发现了很多关于可能丢失数据的信息,这让我感到困惑。这是一个初学者练习,所以我不认为计算应该非常精确。谢谢

最佳答案

假设输入的格式正确。

也就是说,您收到的所有货币金额都将采用

的形式
99.99

9 符号可以是 0 到 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

从那里您可以继续提高输入的稳健性。如果有两位小数呢?如果输入中有字符怎么办?

我建议您编写几个测试来测试尽可能多的输入可能性,假设是有史以来最愚蠢、最不懂计算机的用户。你应该如何处理无效输入?要求更多,抛出异常,使用默认值并打印警告?所有这些都是您将来在处理用户输入时要做出的决定。

编辑: 解决你的最后一点

arithmetic operations need to be accurate to the last cent using the 4/5 rounding rule.

这通常不会太难,只是很乏味。你将遇到的最大障碍将是 split 。此时您需要非常小心整数舍入。即:

2/1 将生成 0,而不是 0.5

不应实现乘法和除法运算,因为它们没有意义。在网络上搜索以了解如何使用整数除法准确舍入。

关于c++ - 初学者练习 : Design a Money class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34948408/

相关文章:

java - 通过添加 '.' 、 ',' 、修剪(不四舍五入)使双倍可读,因此只有最后 2 位数字可能?

c++ - 重载运算符 new

c++ - AMD OpenGL ES SDK 设置

c++ - 对象数组的条目未更新

css - 我的类(class)拒绝将其规则应用于列表

php - 如何将金额格式转换为印尼盾?

c# - 如何接受 "$1,250.00"之类的字符串并将其转换为 C# 中的小数?

android - 是否可以更改android studio本身中的.so文件代码并进行构建?

javascript - 具有相同类的容器具有单独的 jquery 效果

c# - 在c#中创建一个实现多个接口(interface)的抽象类