货币数据的Visual C ++舍入问题

时间:2012-03-14 06:48:16

标签: c++ floating-point

在我的财务相关应用程序中,Double用作货币数据的数据类型。但最近我发现Double在舍入时有问题。

作为双变量内的例子
                           35.25存储为35.249999999999999999999                            35.75存储为35.750000000000000000001

所以什么时候尝试将数字四舍五入到一个小数点                            35.25 = 35.3                            35.75 = 35.8

这意味着从地板到天花板的一个数字。

  1. 有人可以为此问题提出解决方案吗?

  2. Visual C ++中用于货币数据的合适数据类型

2 个答案:

答案 0 :(得分:6)

IEEE-754将不同的数据类型定义为具有不同的有效数字级别。

例如,IEEE-754 defines a double仅具有15.95的十进制数字精度。

因此,一个选项是通过将最终值四舍五入到小于此最大限制的有效位数来确保您保持在最大精度范围内。

但你如何舍入通常是由你正在进行的金融计算类型预先定义的。

例如,外汇现货价格通常被引用到4个减价位置,而利率则被引用到7个小数位。

因此,如果没有更多关于您正在进行何种计算的信息,那么提供解决方案有点困难。

答案 1 :(得分:3)

你的问题不是四舍五入。它是how floating point values are represented in the computer.

这就是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