猿问

在C ++中存储货币值的最佳方法

我知道,由于舍入错误,浮点数不适用于存储货币值。有没有一种标准的方式来用C ++表示金钱?

我看过Boost库,却一无所获。在Java中,似乎BigInteger是这样,但我找不到C ++中的等效项。我可以编写自己的货币课程,但是如果经过测试,则最好不要这样做。


九州编程
浏览 388回答 3
3回答

BIG阳

不要将其存储为美分,因为当您快速乘以税金和利息时会累积错误。至少要保留两个有效数字:$ 12.45将被存储为124,500。如果将其保留为带符号的32位整数,则可以使用$ 200,000(正数或负数)。如果您需要更大的数字或更高的精度,则带符号的64位整数可能会为您提供长时间所需的所有空间。将这个值包装在一个类中,为您提供一个位置来创建这些值,对其进行算术并格式化它们以便显示,可能会有所帮助。这也将使您可以集中存放所存储的货币(美元,加元,欧元等)。

回首忆惘然

在实际的金融系统中处理了这个问题之后,我可以告诉您,您可能想使用精度至少为小数点后6位(假设美元)的数字。希望由于您在谈论货币价值,所以不会对您造成太大的影响。有建议为C ++添加十进制类型,但我不知道实际上有没有十进制类型。在这里使用的最佳本机C ++类型将是long double。其他仅使用int的方法的问题在于,您必须存储的不仅是美分。通常,金融交易会乘以非整数值,这会给您带来麻烦,因为$ 100.25转换为10025 * 0.000123523(例如APR)会引起问题。您最终将最终陷入浮点土地,而转换将花费您很多钱。现在,在大多数简单情况下都不会发生此问题。我给你一个精确的例子:给定几千种货币值,如果您将每个货币值乘以一个百分比然后相加,那么如果您没有保留足够的小数位数,则最终得出的数字将不同于将总数乘以该百分比所得到的数字。现在,这在某些情况下可能会起作用,但是您很快就会掉价几分钱。根据我的一般经验,请确保您将精度保持在小数点后6位(确保剩下的精度可用于整数部分)。还应了解,如果以不太精确的方式进行数学运算,则存储哪种类型都没有关系。如果您的数学是在单精度范围内完成的,则以双精度存储它并不重要。对于最不精确的计算,您的精度将是正确的。话虽如此,如果您不做简单的加法或减法运算,然后存储数字,那您就可以了,但是一旦出现任何比这更复杂的事情,您就会遇到麻烦。

陪伴而非守候

最大的问题是四舍五入!42,50€的19%= 8,075€。根据德国四舍五入规则,这是8,08€。问题是,(至少在我的机器上)8075不能表示为double。即使我将调试器中的变量更改为该值,我最终也会得到8,0749999 ....这就是我的舍入函数(以及我能想到的任何其他浮点逻辑)失败的地方,因为它产生8,07€。有效数字为4,因此该值四舍五入。这是很明显的错误,除非您避免使用浮点值,否则您将无能为力。如果您将42,50€表示为Integer 42500000,则效果很好。42500000 * 19/100 =8075000。现在您可以将舍入规则应用到8080000以上。由于显示原因,可以很容易地将其转换为货币值。8,08€。但是我总是将其包装在一个类中。
随时随地看视频慕课网APP
我要回答