java BigDecimal精度问题

float类型构造参数


 float money = 0.1f;
 BigDecimal floatBig = new BigDecimal(money);
 System.out.println(floatBig.toString());
执行结果:0.100000001490116119384765625

double类型构造参数


 double moneyDouble  = 0.1d;
 BigDecimal moneyDoubleBig = new BigDecimal(moneyDouble);
 System.out.println(moneyDoubleBig.toString());
执行结果:0.1000000000000000055511151231257827021181583404541015625

string类型构造参数


 String moneyString  = "0.1";
 BigDecimal bigDecimalString  =  new BigDecimal(moneyString);
 System.out.println(bigDecimalString.toString());
执行结果:0.1

从上面结果可以看出使用不同构造函数产生的结果是不同的,对于系统精度要求较高的计算(如涉及金钱)基本都使用Bigdecimal类进行基本运算,但是这里有个小坑,如果没有进行验证或没有研究就使用会碰到精度的问题。

查看Bigdecimal源码:

  1. 以double为构造参数;
    在这里插入图片描述

    The results of this constructor can be somewhat unpredictable这句提示这个构造函数的结果可能有些不可预测,并且下面也举例了以0.1为参数创建的结果实际为0.1000000000000000055511151231257827021181583404541015625
    所以在使用Bigdecimal的时候请使用String为构造参数创建对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值