一、上例子
对于上面两行代码,使用的构造器一个传入是字符串,一个是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其他的坑
在做乘除法的时候约定好保留小数位数和末位舍入规则。