【问题标题】:Decimal rounding strategies in enterprise applications企业应用程序中的小数舍入策略
【发布时间】:2011-01-31 10:57:47
【问题描述】:

嗯,我想知道一个小数四舍五入的事情,并将它们存储在数据库中。

问题是这样的:

假设我们有一个客户和一张发票。

发票的总价为 100.495 美元(由于某些折扣百分比不是整数),但显示为 100.50 美元(四舍五入后,仅用于打印在发票上)。它以 100.495 美元的价格存储在数据库中,这意味着当客户存入 100.50 美元时,账户上将多出 0.005 美元。如果四舍五入,它将显示为 0 美元,但在几张发票之后,它会不断累积,这看起来是错误的(尽管实际上不是)。

在这种情况下最好做什么。存储 100.50 美元的价值,还是保持原样?

【问题讨论】:

  • 呃-哦!基数编辑大战! “逗号!” “不,期间!” “不,逗号!” “不,期间!” ...
  • 为香肠切片攻击做好准备,嗯? en.wikipedia.org/wiki/Salami_slicing :-)
  • 您每天都会学到新东西。 :O

标签: c# database enterprise rounding


【解决方案1】:

这取决于什么更重要。但通常,如果您使用会计或发票系统,余额调节是一个重要目标。所以出于这个原因,我会存储四舍五入的值。

【讨论】:

    【解决方案2】:

    我会保存两者(认真)。

    【讨论】:

      【解决方案3】:

      存储两者。无论如何,您的客户将无法使用信用卡支付未四舍五入的金额,但您的账簿必须是正确的。

      【讨论】:

        【解决方案4】:

        您应该完全按照您希望它反映在他们的余额中的方式存储该数字。

        您实际上是在向客户收取 0.5 美分吗?如果是,它应该反映在 DB 条目中。如果你不是,那么它不应该。

        但除非我每天发布应计利息(例如 Prosper.com),否则我会坚持使用人们可以准确支付(或提取)的货币单位。

        【讨论】:

        • 不,我们不收取那半美分的费用,因为发票上写着 100.50 美元,这是客户存入的金额。该系统几乎只用于客户余额,没有资产负债表、现金流量表或任何其他重要的会计信息。那你有什么建议,把它四舍五入,然后这样存储?
        • 在这种情况下,一定要存储四舍五入的金额。如果客户购买一个,收取(并存储)100.50 美元(或 100.49 美元,但是您想将整个金额四舍五入)。如果他们买两个,收费并存储 200.99 美元。在您的情况下,订单完成后半美分无关紧要,所以忘记它。
        • 无论您的业务规则是什么,这就是您应该存储的内容。如果您收取 100.50 美元而客户支付了 100.50 美元,那么存储 100.495 美元对所有相关人员来说都是毫无价值的。就像如果是 100.3333333333,您不会存储所有三个,您的业务规则会告诉您如何以及何时将其切断。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-15
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        相关资源
        最近更新 更多