如果浮点数和双精度浮点数不够准确,银行如何进行涉及货币的精确计算?

10

我目前正在学习C++,这个问题刚刚浮现在我的脑海中。我只是好奇,因为我即将开发一个简单的银行程序。我将使用double来计算美元/利率等,但是计算机计算和人类计算之间存在一些微小的差异。

我想象中,现实世界中的那些额外的.几分钱可能会产生很大的差别!


3
请查看 https://dev59.com/0HVC5IYBdhLWcg3w51ny ,其中讨论了在C语言中存储货币值的最佳方法。 - Brandon Kreisel
那个页面提供了很多有用的信息,非常感谢! - user680269
请参阅http://introcs.cs.princeton.edu/java/91float/,该网站详细描述了这个问题,适合计算机科学专业的学生。 - jvriesem
4个回答

14
在许多情况下,金融计算使用的是定点算术,而不是浮点算术。
例如,.NET中的Decimal类型或VB6中的Currency类型。这些基本上只是整数类型,其中每个人都同意单位是一分钱的一些分数,如$.0001。
是的,必须进行一些舍入,但它是非常系统地完成的。通常,舍入规则在您合同的细节中(利率为x%,每T复利,向上舍入到最近的一分钱,但每个声明周期不少于$y)。

我同意,游戏坐标的非常精确的计算通常也使用整数计算。浮点数计算总是存在一定程度的舍入误差。 - Chris Snowden
没想到这个角度,谢谢。我正在研究定点算术。另一个想法是银行是否利用四舍五入来获得巨额利润(考虑到大量交易一直在发生)。 - user680269
2
@Kurzon:“普通”的交易没有任何舍入误差,因为当我向您转账1.23美元时,我的余额会减少123分,而您的余额会增加123分:定点数会处理它。这适用于利息和佣金等事项,其中您将某些百分比的货币乘以可能有很多小数位的数量。但是像Ben所说的那样,规则由合同或某个法律定义。如果您是高速套利交易员,也许您关心舍入规则。其他客户可能不太在意。 - Steve Jessop
十进制是一种浮点类型而不是固定的。然而,正如其名称所示,它是浮点十进制。使用浮点十进制,例如数字0.1可以被准确地表示。然而,使用float时,0.1无法被准确地表示。通常,在银行业务中,出于性能原因,会将double类型进行缩放并使用,尽管它是一种二进制浮点类型。这需要开发人员真正了解精度和比例的操作技巧。 - Frank

2
一个8字节长整型的范围是:-9223372036854775808最大值:9223372036854775807,即使以千分之一美分/便士的方式计算,您仍然可以处理高达数万亿美元/英镑/其他货币的数字。

1

这取决于应用程序。所有带有小数的计算在输出为美元和分(或本地货币)时都需要四舍五入:一篇文章的基础价格可能只有两位小数,但是当您加上销售税或增值税时,会有更多小数位数,如果您需要计算投资利息,则会有更多小数位数。

通常情况下,使用 double 可以得到最准确的结果,但是……如果您的软件被用于法律要求的某种簿记(例如用于税务目的),则可能需要遵循标准接受的四舍五入实践,而这些实践基于十进制算术,而不是二进制、十六进制或八进制(这些是浮点数的常见基数——除了大型机之外,二进制是普遍适用的)。在这种情况下,您将需要使用某种 Decimal 类,以确保正确的舍入。对于其他用途(例如风险分析),double 就可以了。


0

仅仅因为一个数字不是整数并不意味着它不能被精确计算。考虑到美元和美分的价值可以通过计算出其对应的美分数量来表示,因此使用两位小数点的定点库只需要将每个数字乘以100,作为整数进行计算,然后再除以100即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接