【问题标题】:Visual C++ rounding issue for currency data货币数据的 Visual C++ 舍入问题
【发布时间】:2012-03-14 06:48:16
【问题描述】:

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

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

那么它什么时候会尝试将数字四舍五入到小数点后一位 35.25 = 35.3 35.75 = 35.8

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

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

  2. Visual C++ 中的货币数据应该使用什么合适的数据类型

【问题讨论】:

标签: c++ floating-point


【解决方案1】:

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

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

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

但是,您的取整方式通常由您正在进行的财务计算类型预先定义。

例如,外汇现货价格通常以小数点后 4 位报价,汇率以小数点后 7 位报价。

因此,如果没有更多关于您正在做什么类型的计算的信息,提供解决方案有点困难。

【讨论】:

  • 嗨 Blake7,非常感谢您的回复,您能给我一个样本如何保持在最大精度范围内。
【解决方案2】:

您的问题不是四舍五入。是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

【讨论】:

  • 您好 foraidt,您能否给我一些 int 用于货币相关计算的示例用法。
猜你喜欢
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 2011-09-10
  • 1970-01-01
相关资源
最近更新 更多