清理值而不向上或向下舍入
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)
然后我的界面会迫使你首先详细地转换它,让你在问题变得相关时考虑问题,但仍然支持安全操作,例如透明和准确地添加。
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- C++ 中的舍入函数
- 舍入 QDecDouble 值,精度最多为两个字符
- 将大 int 转换为浮点数,而不舍入 c++
- 舍入错误检测
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 将整数舍入到另一个整数的最接近的倍数
- Sizeof 舍入到对齐方式,但编译器仍将对象放在剩余的字节中
- 避免将 Int 转换为双重类型转换舍入
- 浮点数学运算后舍入不一致
- 浮动到绳子而无需舍入
- C++长双精度格式而不舍入
- 是否可以为 AVR 编写一个 constexpr 舍入函数?
- Time_T舍入到几分钟