c++ - 使用 4/5 舍入规则对数字进行舍入

标签 c++ class rounding rounding-error

我目前正在学习 C++。

I have to write a simple class Money that performs calculations involving dollars and cents where arithmetic has to be accurate to the last cent using the 4/5 rounding rule.

我以前从未处理过金钱数额,所以我在理解如何从我的类(class)中获得最好的成绩时遇到了一些麻烦。我知道我不应该用 float 表示货币金额。所以我为我的类使用了两个数据成员来分别存储美元和美分:

long int dollars
long int cents 

我的问题是我不知道何时以及如何对数字进行舍入。当我试图为这个类实现一个输入运算符时,我问了自己这个问题。假设用户输入以下值:12.456、45.999、9.54

  1. 我应该在什么时候四舍五入这些数字?

  2. 我应该先在算术运算中使用它们然后对结果进行舍入,还是在将它们输入程序时直接对它们进行舍入?

最佳答案

拥有独立的美元和美分成员只会使代码变得不必要的复杂。只需使用 cents,然后为 I/O 重载算术和赋值运算符、构造函数以及可能的 << 和 >>。

加法和减法很简单,在本例中只是按比例缩放 100 的普通整数运算。一般来说,定点除法/乘法需要重新缩放;在这种情况下你可以忽略它,因为用金钱除以或乘以金钱是没有意义的;但是,您可能希望对货币乘以或除以整数和浮点类型进行重载(例如,用于税收、折扣或利息计算)。

通过为金钱重载 << 和 >> 运算符,您可以控制美分值的输入或显示方式 - 通过将其转换为 dollars.cents

在许多情况下可能需要舍入,但在大多数情况下,这些可以通过运算符重载来处理。例如,以美元为单位的用户输入可以由赋值运算符和构造函数处理,而可能导致几分之一美分的利息、税收或股份分配计算可以通过重载 * 和/运算符来处理(尽管可能在内部使用赋值或构造函数,以便您只需要在一个地方进行舍入)。

保持以美分为单位的值并将浮点输入或中间美元值四舍五入为美分,正/负值处理可以按如下方式实现:

long long cents = static_cast<long long>((std::abs(dollars_fp) + 0.005) * 100) ;
if( dollars_fp < 0 )
{
    cents = -cents ;
}

关于c++ - 使用 4/5 舍入规则对数字进行舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35116492/

相关文章:

c - 为什么数字 51444.325061 不四舍五入到 51444.325 到小数点后 3 位?我想在c编程中四舍五入这个数字

c++ - 可变函数

c++ - FatFS - 无法格式化驱动器,FR_MKFS_ABORTED

c# - 非静态字段、方法或属性需要对象引用 'Player.Name' (FiveM

Java:一个文件中的多个类声明

mysql 舍入误差和聚合函数

C++ 内存管理

C++0x : when a temporary object equals another temporary object

class - Cython 中的递归 cdef 类

sql - 舍入到 SQL 中最接近的奇数整数