详细解决方案
java数字精确计算-BigDecimal
热度:21 发布时间:2023-12-12 17:59:44.0
背景
- float和double类型的数据,使用二进制来保存数据,对于浮点数必然会丢失精度。
- 对于要求精确的场景(如银行)需要使用BigDecimal类来处理数据。
- 所有运算使用BigDecimal类的方法才会保证精度,否则会丢失精度。
- BigDecimal转换为Double进行计算会丢失精度。
构造方法
- BigDecimal(int) 创建一个具有参数所指定整数值的对象。
- BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //不推荐使用
- BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
- BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用
运算方法
- add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
- subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
- multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
- divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
转化方法
- toString() 将BigDecimal对象的数值转换成字符串。
- doubleValue() 将BigDecimal对象中的值以双精度数返回。
- floatValue() 将BigDecimal对象中的值以单精度数返回。
- longValue() 将BigDecimal对象中的值以长整数返回。
- intValue() 将BigDecimal对象中的值以整数返回。
设置精度
- 除法设置精度:divide(BigDecimal,保留小数点后几位小数,舍入模式)
- BigDecimal数值设置精度:bd.setScale(保留小数点后几位小数,舍入模式)
注意点
- 使用浮点数来构造BigDecimal,会出现丢失精度(或者小数位很长),需要使用如下方法来解决:
- 转成String来构造BigDecimal:new BigDecimal(Double.toString(0.1))
- 使用BigDecimal的静态构造方法:BigDecimal.valueOf(3.656)
- BigDecimal运算建议使用BigDecimal类提供的方法,保证精度不丢失。
- 舍入模式有8种,如BigDecimal.ROUND_HALF_UP