前言
通常商业计算涉及到小数的,我们都会使用BigDecimal来完成加减乘除运算。但是利用BigDecimal进行浮点数精确运算时,需要注意使用正确的方法。如果方法选择不当,依旧会发生错误。
发现问题

分析原因
查看BigDecimal.valueOf源码,我们可以发现问题。BigDecimal.valueOf(9.9f),实际调用的方法是:java.math.BigDecimal#valueOf(double)。如下图所示。


拓展
假如参数是double类型,我们使用BigDecimal.valueOf(...)可以吗?



总结
1、在使用BigDecimal进行科学运算的时候,我们需要清楚,BigDecimal.valueOf(...)和new BigDecimal(...)的使用效果不同。当BigDecimal.valueOf(...)的入参是float类型时,BigDecimal会把入参强制转换成double类型。 2、使用new BigDecimal(String val)来获得浮点数对应的BigDecimal对象,进而完成浮点数精确运算。