BigDecimal

简介

  • 使用double和float时,有时候数学中很简单的小数加减乘除却可能生成很多很多位的浮点数。我们可以使用BigDecimal解决

    • BigDecimal可以表示一个任意大小精度完全准确的浮点数。
    • 在bigdecimal看来小数部分末尾的0并不是没有意义的,同样会计算进去位数

      创建BigDecimal

  • BigDecimal构造方法可以传入double和字符串创建,但是必须使用字符串进行创建,直接传入浮点数可能生成一个不确定的浮点数 ```javascript BigDecimal a =new BigDecimal(0.1); //得到0.100000000000000005551115…

BigDecimal b =new BigDecimal(“0.1”);//得到期望的0.1

  1. <a name="h7pmO"></a>
  2. ## 小数位数
  3. - 使用`scale()`获取小数位数,**如果是普通整数则返回0**,**如果是科学计数的整数则返回0或者负数**,负数的绝对值表示末尾0的个数
  4. - `stripTrailingZeros()`可以将一个BigDecimal格式化为一个相等的,但去掉了末尾0的BigDecimal
  5. - 如果是整数,则转换为科学计数
  6. - 如果是浮点数,则去掉小数部分无计算意义的0
  7. - `setScale()`可以取?位小数。如果原本的位数超过指定的位数,进行四舍五入或者截断。**如果不足,小数部分补0**
  8. ```java
  9. BigDecimal d1 = new BigDecimal("123.4500");
  10. BigDecimal d2 = d1.stripTrailingZeros(); //123.45,去掉无意义的0
  11. d1.scale(); //返回4 d2.scale();// 返回2
  12. BigDecimal d3 = new BigDecimal("1234500");
  13. BigDecimal d4 = d3.stripTrailingZeros(); //1.2345E+6
  14. System.out.println(d3.scale()); // 0 普通整数,返回0
  15. System.out.println(d4.scale()); // -2 绝对值2表示整数最后的0个数
BigDecimal d1 = new BigDecimal("123.456789");
BigDecimal d2 = d1.setScale(4, RoundingMode.HALF_UP); // 四舍五入,123.4568
BigDecimal d3 = d1.setScale(4, RoundingMode.DOWN); // 直接截断,123.4567
d3.setScale(6,RoundingMode.HALF_UP)   //123.456700   补0

加减乘除

  • bigdecimal的加减乘除精度不会丢失。
    • 加减结果的精度为二者中的最大的精度,
    • 乘法结果的精度为二者精度的相加。12.0*12.00=144.000
    • 除法结果的精度有点复杂,分3种情况,懒得总结了
  • 除法最好都设置除不尽时的保留位数与保留方式,不设置如果除不尽会报错

    BigDecimal d1 = new BigDecimal("123.4500");
    BigDecimal d2 = new BigDecimal("456.45");
    加:d1.add(d2)
    减:d1.subtract(d2)  //d1-d2=-333.0000   精度不会丢失
    乘:d1.multiply(d2)  
    除:d1.divide(d2)  //  d1/d2
     d1.divide(d2, 10, RoundingMode.HALF_UP);   //保留10位小数,四舍五入
    

    比较

  • 使用equals对bigdecimal比较,值相等且位数相同才会返回true

  • 必须使用compareTo()进行值的大小比较,不受位数影响。返回正数(大于),负数(小于),0(相等)