清理值而不向上或向下舍入

clean up value without rounding up or down

本文关键字:舍入      更新时间:2023-10-16

我的软件有一个用于处理的输入:float totalPurchased。我正在使用 C++11/GCC/GDB/Linux 编码。

通知的总购买价格为 14.92,因为它是从文件中读取的。

但是,当程序运行时,它会不知从哪里显示 14.920001。我不想将值 14.92 舍入到 15.00 或向下 14.00;我唯一真正需要的是输入正确,而无需编译器将不存在的内容作为输入添加。

问题是,从长远来看,这个 0.000001 正在破坏整个软件计算的一部分。

如何摆脱这个 0.000001,并确保它显示为从文件中读取到我的浮点变量中的实际值:14.92?

非常感谢所有的意见和建议。

不幸的是,浮点不能准确地表示你的数字:14.92是二进制中的重复分数。

你想问自己的问题是:为什么这么小的偏移会破坏你的计算? 如果您确实需要如此精确地比较值,那么浮点可能不是合适的数据类型。

如果您需要诸如确切

的百分比或确切的美分数之类的东西,则可以存储100*数字。 这是会计中一个持续存在的问题,这就是为什么会计师不使用浮点来添加他们的钱。

使用这样的定点库。

就我自己而言,在这个领域,我会将价格存储为整数便士,并按照以下路线做一些事情

sprintf("%i.%02i", price/100, price%100)

负数的警告,在某些应用程序中,您可能想要亚美分精度,但您明白了。我认为,对于这样的事情,一个完整的定点库是矫枉过正的。

事实上,因为我喜欢做正确的事,我会做这样的事情

class CashValue
{
public:
    static CashValue parse (const std::string &);
    float to_float () const;
    CashValue & operator + (const CashValue &);
    // etc
private:
    int m_pennies;
};

从而使单位的重要性明确。仅支持存在确切解决方案的操作。如果你想做这样的事情

price *= pow (1.0 + (percent_interest/100.0), years)

然后我的界面会迫使你首先详细地转换它,让你在问题变得相关时考虑问题,但仍然支持安全操作,例如透明和准确地添加。