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

Visual C++ rounding issue for currency data

本文关键字:舍入 问题 C++ Visual 数据 货币      更新时间:2023-10-16

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

作为双变量内部的示例
35.25存储为35.24999999999999999999935.75存储为35.750000000000000000001

那么它什么时候把数字四舍五入到小数点35.25=35.335.75=35.8

它的意思是一个数字到天花板,另一个到地板。

  1. 有人能为这个问题提出解决方案吗?

  2. 在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