关于BigDecimal的一次采坑记录

一、上例子

 

对于上面两行代码,使用的构造器一个传入是字符串,一个是double型,那么输出结果是什么呢?如果简单你认为是5432.07的话,我想很多童鞋也踩了这个坑了,输出结果如下:

二、关于Double,Float和BigDecimal的使用

《Effactive Java》这本书中是这么说的,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,需使用BigDecimal。
 

三、为什么BigDecimal因为参数类型不一样,输出结果差别这么大?

double和float类型的数字在底层是用二进制浮点进行运算,而二进制数对于无法准确的表示一部分或者说大部分的double和float精度的数,因此BigDecimal在将double转为BigDecimal的时候,为了和之前精度一致就出错了,我们举个例子来看一下:

下图是0.1十进制转二进制

下图是0.5十进制转二进制

很显然,所以二进制无法完全准确的表示所有的double,float类型的数,因此会出现BigDecimal精度丢失的问题。

 

四、如何避坑?

强烈建议使用String作为参数类型,如果入参是double活着float也给转成String

 

五、BIgDecimal其他的坑

在做乘除法的时候约定好保留小数位数和末位舍入规则。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值