总结:浮点数运算不精确的问题本质上是在存储的时候就不精确,这个问题会持续到即使使用到专业的工具类BigDecimal来使用时,如果仅仅只是传double类型做入参时依然会导致运算不精确,所以即使在使用BigDecimal工具类进行构造时也要使用String类型的构造函数,尽量避免使用double类型的构造函数
在使用普通的double数据类型进行存值并进行运算时,会造成数据不精确的问题,所以会用到BigDecimal,记录一下使用过程中遇到的问题解决和注意事项
首先到API手册查看BigDecimal类的介绍以及使用(构造方法)
这四个方法一眼就能看出来用法
使用double类型为入参的
- BigDecimal(double val)
构造方法,在idea中测试
即new一个BigDecimal,传入一个double类型入参即可,下面来做加减乘除运算
加减乘除四个方法都是以一个BigDecimal调方法并传另一个BigDecimal即可返回结果,加减乘除四个方法分别是
add(BigDecimal augend)
subtract (BigDecimal augend)
multiply(BigDecimal augend)
divide(BigDecimal augend)
下面加减乘法运算居然更不精确了,并且除法运算偶尔还报错了,因为在实例化BigDecimal工具类时,仅仅只是传double类型做入参时依然会导致运算不精确,所以即使在使用BigDecimal工具类进行构造时也要使用String类型的构造函数,尽量避免使用double类型的构造函数。这里在double数后面拼接一个空字符串再测试:
可以看到加减乘法都可以正常运算了,但除法还是报错,这里来看一下报错信息
非终止十进制展开;没有精确可表示的十进制结果。
ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result
算数异常 :非终止十进制展开 ;没有精确可表示的十进制结果。
很明显出现了除不尽的问题,这里需要使用divide方法的重载方法,有三个参数,第一个是被除数,二参为保留小数位数,三餐为舍入方式,(ROUND_HALF_UP表示四舍五入方法)