money工具类的一个数据精算问题

上一篇 / 下一篇  2013-03-08 17:00:29

Hi all:

给大家分享一个以前的老bug,由于最近外卡2.5产品又开始要对汇率进行计算了,所以这部分清梦、乘云帆、郭金金请重点关注一下开发的代码,尤其是涉及money工具类的使用上。

去年测试一个项目的时候发现一个“金额精度”的问题,然而这一次精度的问题并不是因为使用的double类型的关系,而是money.class的一个底层问题。查阅了google上很多资料,目前业内对于四舍五入有多种使用的方式。如正常的四舍五入,默认五入,直接舍弃保留有效数等等。而我们支付宝使用的是这样一个金钱精度策略:

四舍五入的策略为当小数为0.5时,则取最近的偶数。举例:0.045 四舍五入=0.04  0.035四舍五入=0.04

大家如果有兴趣的话可以去查看一下这段代码

/**

* 缺省的取整模式,为<code>BigDecimal.ROUND_HALF_EVEN

* (四舍五入,当小数为0.5时,则取最近的偶数)。

*/

public static final int DEFAULT_ROUNDING_MODE = BigDecimal.ROUND_HALF_EVEN;

这样的处理在业内也是正确的处理,大家后续在涉及到金融除法的时候需要特别关注。如果遇到9分钱和7分钱取半值的结果都是4分钱的时候不要太惊讶哦-_,-

附带一些金额计算的常用方法资料

ROUND_HALF_EVEN
Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6

ROUND_HALF_DOWN
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5


TAG:

 

评分:0

我来说两句

Open Toolbar