处理金钱输入的最佳方式

Best way to handle handle input for money

所以我正在用 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;
            }

切勿使用双精度数或浮点数来存储这些类型的信息。原因是 float 和 double 并不像看起来那么准确。

这是 0.1 在二进制中的样子:

>>> 0.1

0.0001100110011001100110011001100110011001100110011...

这是一个如何将 0.1 存储在浮点数中的示例。这是由于...11001100...的无限小数位被删掉造成的,因为我们无法存储所有(无限数量)的小数位:

0.1000000000000000055511151231257827021181583404541015625

所以每个 float 或 double 都不准确。乍一看我们看不出来(因为不准确度真的很小 - 对于某些类型的利用),但问题可以累积 - 如果我们用这些数字进行数学运算。

银行程序正是这种程序,它会导致问题。

我可能会创建一个结构:

struct Amount {
      int dollars;
      int cents;
      
      void recalculate() {
            dollars += cents / 100;
            cents = cents % 100;
      }
};

recalculate() 函数会在您每次需要时将整数转换为“人类的阅读方式”。