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: