2010-05-18 28 views
8

什么是你的意见:在金钱对象的集合累积误差的处理货币密集型软件舍入错误的常用策略?

  1. 补偿大量的数学运算。你的生产环境中的代码如何实现?
  2. 理论落后于会计。
  3. 任何文学关于主题。

我目前阅读Fowler。他提到Money类型,它是类型结构(int,long,BigDecimal),但在策略上没有提及。

关于存款的旧帖子(herehere)没有提供我需要的详细信息和手续。

我在inet中发现的想法与“Round half even”有关,这是平衡错误的最佳方式。

感谢您的帮助。

+0

如果你问的是会计,你应该问一个实际的会计师。他们有规则。在美国,GAAP涵盖了这一点。你有问过会计师吗?您是否找到适用于您的语言环境的会计规则? – 2010-05-18 19:35:48

+0

@ S.Lott:嗨,我在立陶宛。今天我跟当地银行工作人员谈过:)。她对我说,在月底或季末他们会简单地填写差异。但是这个答案不符合我的需要。 – Max 2010-05-18 19:40:07

+0

然后找到一个更好的会计师。认真。这在立陶宛很可能受到法律的覆盖。如果不是通过法律,那么通过一些专业标准(这是美国公认会计原则在美国)。会计师详细记录了这一点。 – 2010-05-19 09:58:52

回答

3

使用银行家的舍入。你四舍五入到最近的两分钱。

http://www.xbeat.net/vbspeed/i_BankersRounding.htm

您可以在此扩大到圆toward最近的两分钱来代替。所以22.5到22,但是23.5到24. 23.1和22.9都到23。然而,原来银行家的算法更受欢迎。

+0

感谢您的扩展。 – Max 2010-05-18 20:17:27

3

切勿将货币值存储为双精度值或浮点数 - 使用intlong,因为无法以二进制精确地存储0.1。

+0

通常那些int's&long's&BigDecimal's是Money的内部结构。有趣的是,当你在Money上进行大量操作时,如何对抗积累的错误。 – Max 2010-05-18 20:04:00

+3

@max:这是什么,会计溢出? ;) – Robert 2010-05-18 20:12:44

+0

你在做什么操作?标准算术运算不会有任何舍入误差 - 这是使用定点表示的目的。 – 2010-05-22 01:58:00

3

这一切都取决于应用程序。希望没有太多需要舍入的情况。例如,从一个账户转账到另一个账户不需要四舍五入。

对于需要四舍五入的情况,只要您选择一项政策,进行沟通并坚持使用,您所做的并不重要。例如,我相信我的储蓄账户的利息下降到最接近的一分钱。

1

我工作有点(只是一个位)货币金额,我是为我公司所使用的策略非常好奇...

事实证明,我们使用double,但他们已经想过它。

问题是我们处理的金额不是很大(比如小于10k),最多我们需要小数点后3位数字,总共有7位有效数字。

由于我们使用的64位软件(和C++)的double类型提供了足够的显著位数操作的数量,我们继续吧:)

如果您需要更精确,有算法使用(例如同时加入多个款项),但我个人认为这个问题的心脏来自多个来源:

  • 转换,从一个钱到另一个,这是不断变化的过程中
  • 打印问题,有些款项不需要小数,其他最多需要2个,等等...

也许你能对你正在做的业务拓展?

+0

嗨,Matthieu。我还看到一个遗留系统在双打上工作...... 我们遇到了几个问题(您提到的资金转换也是如此)。其他类似于www.ciceuta.es/euro/doc/1/eup22en.pdf中提到的。通常情况下,通过分割和乘法获得的小数的总和有差异。似乎,我会提高这些中间操作的精度,并可能重建计算(但是,“小数”数据的一部分不受我控制)。我得出的结论是,我们要么忽略错误,要么通过平衡像Round-half-even一样的平衡来弥补。 – Max 2010-05-19 10:09:07

5

记录的财务数据时,有许多舍入的问题。 第一个问题是存储和检索精确的十进制数

  • 大多数数据库提供可以在其上前后小数点指定的位数小数的数据类型(货币的小数位数变化的能力,我也“已经处理了货币与0,2,3位数字)
  • 与此数据打交道时
  • 并且要避免在应用程序端的任何意外的舍入误差您可以使用BCD作为通用的方法,也可以使用整数来表示任何固定的十进制形式或调配自己的

如果第一个问题被整理出来,那么没有加法(或减法)可以引入任何舍入错误。乘以整数也一样。

第二个问题,你可以存储和检索数据而不会丢失信息后,预计由于部门(或乘以非整数)的舍入误差。

例如,如果你的货币格式允许2位小数,你想存储事务,记录平衡的10至3等份借记你只能将其存储像

10.00 
-3.33 
-3.33 
-3.33 

-0.01 

(舍入错误)

这是预期的问题,无论数据类型的存储选择如何,都需要考虑,如果你想要你的帐户t平衡。这种情况主要通过划分(或通过乘以具有许多有效数字的非整数)来引入。

一个对付这种方式来验证,如果这种行动后,您的数据平衡和认识,而不是一个错误情况允许的四舍五入差异。

编辑: 至于参考文献,this one似乎有趣,不太长,涉及相当广泛的观众与有趣的情况。

+0

感谢您提醒我BCD的东西。是的,我相信坚持是好的,并允许精确的小数。一般来说,我的问题可以归纳为关于总结小额金额的观点。可惜的是,我并没有完全控制这个分解,我总结自己:)。因此,我可能不得不求助于半舍弃高斯方法或任何其他统计... – Max 2010-05-19 10:15:11

+0

@Max,那么处理这些累积舍入误差的策略取决于您的业务规则(有时您需要使金额相等,并且您有记录错误,其他时间允许分发舍入错误)。 – Unreason 2010-05-19 11:50:33

+0

与BA交谈后,我们将对我们的部分进行修改,并要求改变外部系统,为我们提供这些“小小的不祥”分解量。无论如何,这个SO帖子是有价值的 - 至少我开始觉得四舍五入的工作人员比我期望的更有趣:) – Max 2010-05-19 11:58:54

1

您应该做的事情很可能是您所在的市场或管辖区的惯例。例如,澳大利亚市场的定价债券要求您将某些中间操作汇总到小数点后8位。最后的价格被引用到特定的小数位数(3我认为我的头顶)。

如果您正在处理会计应用程序,我希望您的法律环境的相关会计标准可能会规定这一点。