清理价值没有舍入或减少

问题描述:

有一个输入到我的软件进行处理:float totalPurchased。我用C++ 11/GCC/GDB/Linux编码。清理价值没有舍入或减少

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

但是,当程序运行时,它显示14.920001没有在哪里。我不想round价值14.92上涨15.00或下跌14.00;我真正需要的唯一的东西就是让输入正确,没有编译器加入不存在的输入。

问题是,这个0.000001在长期运行中是整个软件计算的一部分。

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

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

+1

请提供[mcve]。 –

+2

这就是为什么你通常不应该使用浮点类型的金额。使用表示美分数的整数。 – aschepler

+0

@aschepler - 谢谢!我会检查这种方法。 –

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

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

如果您需要诸如确切百分比或确切数量的美分,则可以存储100*该数字。这在会计中是一个持续存在的问题,这就是为什么会计师不使用浮点来增加他们的资金。

+0

所以......你周围的任何工作可能会建议? –

+2

使用表示整数美分的整数。或者使用一些固定的精确数学库,如gmp。 –

使用固定点库such as this

至于我自己,在这个领域,我将存储价格为整数便士和沿

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) 

然后我的界面会迫使你冗长转换首先,让你思考的问题,当他们成为相关,但仍然支持安全的操作,比如除了透明和准确。

+0

你是什么意思:“商店价格为便士”。 –

+1

'to_float'将被实现为'return m_pennies/100.0f' – spraff