货币数据的Visual C++舍入问题
Visual C++ rounding issue for currency data
在我的财务相关应用程序中,双重用作货币数据的数据类型。但最近我发现Double在取整时有问题。
作为双变量内部的示例
35.25存储为35.24999999999999999999935.75存储为35.750000000000000000001
那么它什么时候把数字四舍五入到小数点35.25=35.335.75=35.8
它的意思是一个数字到天花板,另一个到地板。
-
有人能为这个问题提出解决方案吗?
-
在Visual C++中,货币数据应该使用什么合适的数据类型
IEEE-754将不同的数据类型定义为具有不同级别的有效数字。
例如,IEEE-754将双精度定义为只有15.95位小数。
因此,一种选择是通过将最终值四舍五入到小于此最大限制的有效位数,确保您保持在最大精度范围内。
但你的舍入方式通常是由你正在进行的财务计算类型预先定义的。
例如,外汇现货价格的报价通常为小数点后4位,利率的报价为小数点前7位。
因此,如果没有更多关于你正在进行的计算类型的信息,就很难提供解决方案。
您的问题不是四舍五入。这就是浮点值在计算机中的表示方式。
这就是double
不太适合货币相关计算的原因
根据@Mysticial的建议,您可以尝试使用int
,并使用美分而不是美元或欧元作为计算单位。
这样,加法、减法和乘法就可以按预期工作了。不过,你必须注意除法运算,因为这些运算会导致商的任何小数部分被截断,即总是四舍五入。
将值转换为人类可读单位(如欧元和美元)的逻辑完全取决于用户界面,因此只有在显示时,您才需要注意从美分转换为欧元。
样品
这是一个样本,证明没有精度损失。
int a = 25; // 0.25 eurodollars
int b = 1000; // 10.00 ED
int sum = a + b; // 10.25 ED
int difference = b - a; // 9.75 ED
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- C++ 中的舍入函数
- 舍入 QDecDouble 值,精度最多为两个字符
- 将大 int 转换为浮点数,而不舍入 c++
- 舍入错误检测
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 将整数舍入到另一个整数的最接近的倍数
- 类型转换<int>的舍入问题
- 使用设置精度在C++中舍入小数点时出现问题
- 货币数据的Visual C++舍入问题
- 如何优雅地解决这个舍入问题
- 将浮点转换为无符号短整型时出现舍入问题
- c++双舍入问题
- C++舍入问题