浮点数的那些坑,Java中的金额处理方案

Java中的浮点数由于精度问题经常出现意料之外的结果,而我们又不得不和RMB打交道的

有任何问题,欢迎Email to: bob@bob4j.com


1.举个栗子:

public static void main(String[] args) {
System.out.println(50.0+  479.08 );
System.out.println(5.0 - 4.9);
}

在JDK1.7.0_60版本中输出结果是

529.0799999999999
0.09999999999999964


目前可行的解决方案有

1.如果是老系统,以前都是用的Double类型,可以用如下方法在每次运算完成之后格式化一下:

/**
     * 四舍五入
     * @param num
     * @param newScale 保留位数
     * @return
     */
    public static double roundHalfUp(Double num, int newScale){
        if(num == null){
            return 0;
        }
        BigDecimal bd = new BigDecimal(num);
        return bd.setScale(newScale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }


2.新系统建议用Long类型处理金额,精确度为分


3.银行等金融项目BigDecimal


public static void main(String[] args) {
BigDecimal bd = new BigDecimal("50.0"); // 注意,参数是字符串
BigDecimal bd2 = new BigDecimal("479.08");
System.out.println(bd.add(bd2));
System.out.println(50.0+  479.08 );
System.out.println(5.0 - 4.9);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值