【问题标题】:If float and double are not accurate, how do banks perform accurate calculations involving money?如果 float 和 double 不准确,银行如何进行涉及货币的准确计算?
【发布时间】:2012-06-20 15:40:23
【问题描述】:

目前正在学习 C++,这是我刚刚想到的。我只是对此感到好奇,因为我即将开发一个简单的银行程序。我将使用double 来计算美元/利率等,但计算机计算和人工计算之间存在一些细微差别。

我想现实世界中那些额外的 .pennies 可以让一切变得不同!

【问题讨论】:

标签: c++ currency bank


【解决方案1】:

在许多情况下,财务计算是使用定点算法而不是浮点数来完成的。

例如,.NET Decimal 类型或 VB6 Currency 类型。这些基本上只是整数类型,每个人都同意单位是美分的几分之一,比如 $.0001。

是的,必须进行一些舍入,但它是非常系统地完成的。通常,四舍五入规则在合同细则的某处深处(利率为 x%,每 T 复利一次,四舍五入到最接近的美分,但每个报表周期不少于 $y)。

【讨论】:

  • 我同意,非常精确的游戏坐标计算通常也使用整数计算。浮点计算总是存在一定程度的舍入误差。
  • 没想到,干杯。我正在研究定点算术。另一个想法是银行是否使用四舍五入对他们有利,以及它是否会产生大量利润(考虑到大量交易一直在发生)。
  • @Kurzon:“普通”交易没有任何舍入错误,因为当我将$1.23 转给你时,我的余额正好下降了123c,而你的余额正好上升了@987654325 @:定点处理它。它确实适用于诸如利息和佣金之类的事情,您将一定数量的货币乘以可能有很多小数位的某个百分比。但就像本说的那样,规则是由某处的合同或法律定义的。如果您是高速套利交易者,也许您关心舍入规则。其他客户可能没有那么多。
【解决方案2】:

8 字节长的范围是:-9223372036854775808 最大值:9223372036854775807 以数千美分/美分的价格处理所有事情,您仍然可以处理高达数万亿美元/英镑/什么的数字。

【讨论】:

    【解决方案3】:

    这取决于应用程序。所有带小数的计算将 当您将它们输出为美元和美分(或其他任何东西)时需要四舍五入 当地货币是):一篇文章的底价可能只有两个 小数点后的数字,但是当您添加销售税或增值税时, 会更多,如果您需要计算投资利息, 会有更多。

    通常,使用double 会得到最准确的结果, 但是...如果您的软件被用于某种簿记 法律要求(例如出于税收目的),您可能需要遵守 标准接受的舍入做法,这些都是基于十进制 算术,而不是二进制、十六进制或八进制(这是通常的基数) 对于浮点数——二进制在所有东西上都是通用的,但 大型机)。在这种情况下,您需要使用某种Decimal 类,确保正确的舍入。用于其他用途(例如风险 分析),double 很好。

    【讨论】:

      【解决方案4】:

      仅仅因为一个数字不是整数并不意味着它不能被精确计算。考虑到如果计算便士(美分)的数量,美元和美分的值是一个整数,因此对于使用两位小数精度的定点库来说,简单地将每个数字乘以 100 是一件简单的事情,执行计算为整数,然后再除以 100。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多