处理货币密集型软件四舍五入错误的常用策略?

Max*_*Max 10 algorithm finance numbers rounding

你有什么建议:

  1. 补偿 Money对象集合的批量数学运算中的累积误差.如何在您的语言环境的生产代码中实现这一点?
  2. 会计四舍五入的理论.
  3. 关于主题的任何文献.

我现在读福勒.他提到了Money类型,它是典型结构(int,long,BigDecimal),但在策略上没有说什么.

赚钱的旧帖子(这里这里)没有提供我需要的细节和形式.

我在inet中发现的想法与"Round half even"有关,是平衡错误的最佳方法.

感谢帮助.

Unr*_*son 6

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

  • 大多数数据库都提供十进制数据类型,您可以在其上指定小数点前后的位数(货币也以十进制数字的数字变化,我已经处理了0,2,3个十进制数字的货币)
  • 在处理这些数据时你想避免在应用程序端出现任何意外的舍入错误,你可以使用BCD作为通用方法,或者你可以使用整数表示任何固定的十进制表示法或混合你自己的

如果第一个问题被整理出来,那么任何添加(或减法)都不会引入任何舍入错误.乘以整数也是如此.

第二个问题是,在能够存储和检索数据而不丢失信息之后,预期会因为除法(或乘以非整数)而导致舍入错误.

例如,如果您的货币格式允许2位小数,并且您希望存储记录余额的交易,则借记10到3个相等的部分,您只能将其存储为

10.00  
-3.33  
-3.33  
-3.33  
Run Code Online (Sandbox Code Playgroud)

-0.01 
Run Code Online (Sandbox Code Playgroud)

(舍入误差)

无论数据类型存储选择如何,这都是预期会出现的问题,如果您希望帐户保持平衡,则需要注意这一问题.这种情况主要通过除法(或通过乘以具有许多有效数字的非整数)引入.

解决此问题的一种方法是验证您的数据是否在此类操作之后进行平衡,并识别允许的舍入差异而不是错误情况.

编辑:至于参考文献,这个看起来很有趣,而且时间不长,并且涉及到有趣场景的广泛受众.


cor*_*iKa 5

使用银行家四舍五入。您四舍五入到最接近的两便士。

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

您可以对此进行扩展,以舍入toward最接近的两便士。因此,22.5 舍入为 22,但 23.5 舍入为 24。23.1 和 22.9 都舍入为 23。不过,原始银行家算法更受欢迎。