企业应用中的十进制舍入策略

3

嗯,我在考虑一个关于四舍五入小数并将其存储在数据库中的问题。

问题是这样的:

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

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

在这种情况下,最好怎么做?存储100.50美元的值还是保持一切不变?


哎呀!基数编辑战争!“逗号!”“不,句号!”“不,逗号!”“不,句号!”... - John
1
给自己设置薄片攻击的条件了,哈?http://en.wikipedia.org/wiki/Salami_slicing :-) - Eric Lippert
每天都有新的东西可以学习。 :O - Joan Venge
4个回答

5

您应该将数字存储为其在余额中反映的确切值。

您是否实际向客户收取半分钱?如果是,它应该反映在数据库条目中。如果不是,则不应该。

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


不,我们没有收取那半分钱,因为发票上写的是100.50美元,这就是客户存入的金额。该系统几乎完全用于客户余额,没有资产负债表、现金流量表或其他任何会计方面的东西。那么你建议怎么做,将其四舍五入并以此方式存储? - Denis Biondic
在这种情况下,一定要存储舍入后的金额。如果客户购买一个,则收取(并存储)100.50美元(或100.49美元,无论您如何舍入整个金额)。如果他们购买两个,则收取和存储200.99美元。在您的情况下,订单完成后半分钱无关紧要,所以不必考虑它。 - John
无论您的业务规则是什么,都应该存储它。如果您收取了100.50美元,客户支付了100.50美元,那么存储100.495美元对所有相关人员都没有意义。就像如果它变成了100.3333333333,您不会存储所有的三个数字,您的业务规则将告诉您何时以及如何截断它。 - Chris Haas

1

这取决于什么更重要。但通常,如果您正在开发会计或发票系统,则余额调节是一个重要的目标。因此,出于这个原因,我会存储舍入后的值。


1

我会两个都保存(认真的)。


1

两者都存储。无论如何,您的客户都无法通过信用卡支付非圆整金额,但是您的账簿需要正确。


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