很多人都用过Java的BigDecimal类型,但是很多人都用错了。如果使用不当,可能会造成非常致命的线上问题,因为这涉及到金额等数据的计算精度。
首先说一下,一般对于不需要特别高精度的计算,我们使用double或float类型就可以了。
由于计算机天生的无法表达完整的二进制浮点数的小数,二进制的小数是无限循环的,所以只能无限接近于精确值,这就造成了浮点计算的精度问题。此时就需要使用BigDecimal类型了。
踩坑一:初始化
关于浮点数精度的问题,我们可以看下这个代码。
打印结果会是0.2吗?不是,打印结果是0.19999999。因为b最大化接近于0.8,可能是0.80000001,近似于0.8。这就是为什么说精度要求不高时可以用double或float类型,一旦涉及到金额就不能使用浮点类型的原因。
知道了这个原理,我们使用BigDecimal能否避免浮点计算的精度问题?看下这个代码。
打印结果如下:
使用BigDecim