我的软件有一个输入处理:float totalPurchased。我正在使用C ++ 11 / GCC / GDB / Linux进行编码。
从文件中读取的总采购价格为14.92。
然而,当程序运行时,它显示14.920001没有位置。我不希望{14}将价值14.92提高到15.00或低于14.00;我唯一需要的是让输入正确,而编译器不会添加不存在的输入。
问题是,从长远来看,0.000001正在打破整个软件计算的一部分。
如何摆脱这个0.000001,并确保它看起来是从文件读入我的浮点变量的实际值:14.92?
我们非常感谢所有意见和建议。
答案 0 :(得分:4)
不幸的是,浮点数无法准确表示您的数字:14.92
是二进制的重复分数。
您想问自己的问题是:为什么这么小的偏移会破坏您的计算?如果您确实需要如此精确地比较值,那么浮点数可能不是合适的数据类型。
如果你需要一些确切的百分比或精确的分数,你可以存储100*
这个数字。这是会计中一个长期存在的问题,这就是会计师不使用浮点数来增加资金的原因。
答案 1 :(得分:1)
使用定点库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)
然后我的界面会强制您先将其详细转换,让您在相关时考虑问题,但仍然支持安全操作,例如透明且准确地添加。