当前位置: 代码迷 >> 综合 >> java数字精确计算-BigDecimal
  详细解决方案

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
  相关解决方案