BigDecimal

本文深入解析了BigDecimal类的功能,包括算术运算、标度操作、舍入模式、比较、格式转换及异常处理。探讨了不同构造函数的使用场景,如BigInteger、double、long和String类型的转换,并解释了setScale和divide方法的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • BigDecimal提供算数、标度操作、舍入、比较、哈希算法和格式转换。toString方法提供BigDecimal的规范表示形式

 

静态变量
  • ONE、TEN、 ZERO:指定值,并返回
  • ROUND_****:值从0到7的范围

 

构造函数
  • new BigDecimal(BigInteger unscaledVal, int scale)

 

     BigDecimal d0 = new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_UP);
        BigDecimal d1 = new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_DOWN);
        BigDecimal d2 = new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_CEILING);
        BigDecimal d3 = new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_FLOOR);
        BigDecimal d4 = new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_HALF_UP);
        BigDecimal d5 = new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_HALF_DOWN);
        BigDecimal d6 = new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_HALF_EVEN);
        BigDecimal d7 = new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_UNNECESSARY);
        System.out.println(d0);// 99900
        System.out.println(d1);// 9990.0
        System.out.println(d2);// 999.00
        System.out.println(d3);// 99.900
        System.out.println(d4);// 9.9900
        System.out.println(d5);// 0.99900
        System.out.println(d6);// 0.099900
        System.out.println(d7);//  0.0099900
  • new BigDecimal(double val, MathContext mc)

 

        double d = 16.1;
//        d = 6.000;

        BigDecimal doubleToBigDecimal = new BigDecimal(d);
        BigDecimal doubleToBigDecimal_0 = new BigDecimal(d, MathContext.UNLIMITED);
        BigDecimal doubleToBigDecimal_7 = new BigDecimal(d, MathContext.DECIMAL32);
        BigDecimal doubleToBigDecimal_16 = new BigDecimal(d, MathContext.DECIMAL64);
        BigDecimal doubleToBigDecimal_34 = new BigDecimal(d, MathContext.DECIMAL128);
        System.out.println(doubleToBigDecimal);    // d=6.000:6        d=16.1:16.10000000000000142108547152020037174224853515625
        System.out.println(doubleToBigDecimal_0);  // d=6.000:6        d=16.1:和上述一样,16.10000000000000142108547152020037174224853515625
        System.out.println(doubleToBigDecimal_7);  // d=6.000:6        d=6.1:保留7位数,包含小数和整数
        System.out.println(doubleToBigDecimal_16); // d=6.000:6        d=6.1:保留16位数,包含小数和整数
        System.out.println(doubleToBigDecimal_34); // d=6.000:6        d=6.1:保留34位数,包含小数和整数 

 

  • new BigDecimal(long val, MathContext mc)

 

        Long l = 10091L;
        l = 100900L;
        BigDecimal longToBigDecimal = new BigDecimal(l);
        BigDecimal longToBigDecimal_0 = new BigDecimal(l, MathContext.UNLIMITED);
        BigDecimal longToBigDecimal_7 = new BigDecimal(l, MathContext.DECIMAL32);
        BigDecimal longToBigDecimal_16 = new BigDecimal(l, MathContext.DECIMAL64);
        BigDecimal longToBigDecimal_34 = new BigDecimal(l, MathContext.DECIMAL128);
        System.out.println(longToBigDecimal);   // 100901    ;  100900
        System.out.println(longToBigDecimal_0); // 100901   ;   100900
        System.out.println(longToBigDecimal_7); // 100901   ;   100900
        System.out.println(longToBigDecimal_16);// 100901   ;   100900
        System.out.println(longToBigDecimal_34);// 100901   ;   100900    

 

  • new BigDecimal(String val, MathContext mc)

 

        String str = "187";
        str = "187.9";
        BigDecimal strToBigDecimal = new BigDecimal(str);
        BigDecimal strToBigDecimal_0 = new BigDecimal(str, MathContext.UNLIMITED);
        BigDecimal strToBigDecimal_7 = new BigDecimal(str, MathContext.DECIMAL32);
        BigDecimal strToBigDecimal_16 = new BigDecimal(str, MathContext.DECIMAL64);
        BigDecimal strToBigDecimal_34 = new BigDecimal(str, MathContext.DECIMAL128);

        System.out.println(strToBigDecimal);    // 187  ;   187.9
        System.out.println(strToBigDecimal_0);  // 187  ;   187.9
        System.out.println(strToBigDecimal_7);  // 187  ;   187.9
        System.out.println(strToBigDecimal_16); // 187  ;   187.9
        System.out.println(strToBigDecimal_34); // 187  ;   187.9    

 

 

 

常用方法
  • add(BigDecimal val)
  • subtract(BigDecimal val)
  • myltiply(BigDecimal val)
  • divide(BigDecimal val, RoundingMode mode)
    • a.divide(b,2);//2为精度取值 a.divide(b,2);//2为精度取值
    •  /注意以下相除会抛出异常,原因: 通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常  
              //BigDecimal divideBg = a.divide(b);   
              //解决方法是:设置精确度;就是给divide设置精确的小数点 
      divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN)   
              //其中的第二个参数表示的是:保留小数点之后多少位
    • 除法的详细说明
      • divide(BigDecimal divisor, int scale, introundingMode)
      • BigDecimal的setScale方法
        • 用于格式化小数点
        • setScale(1):表示保留一位小数,默认用四舍五入的方式;
        • setScale(1, BigDecimal.ROUND_DOWN):直接删除多余的小数位,如2.35会变成2.3
        • setScale(1, BigDecimal.ROUND_UP):进位处理,2.35变成2.4
        • setScale(1,BigDecimal.ROUND_HALF_UP):四舍五入,2.35变成2.4
        • setScaler(1,BigDecimal.ROUND_HALF_DOWN):四舍五入,2.35变成2.3,如果是5则向下舍入
        • 注意点一
          • scale指的就是你小数点后的位数
          • scale()就是BigDecimal类中的方法。b.scale()返回b小数点后的位数
        • 注意点二
          • roundingMode是小数的保留模式。他们都是BigDecimal中的常量字段
          • 如:BigDecimal.ROUND_HALF_UP表示的就是四舍五入
        • 注意点三
          • divide(BigDecimal divisor, int scale, introundingMode)的意思是说: 
            我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式是什么,是四舍五入啊还是其它的
  • compareTo比较大小
    • 返回值    -1 小于   0 等于    1 大于
取其中最大、最小值、绝对值、相反数
  • a.max (b) //比较取最大值 
  • a.min(b) //比较取最小值
  • a.abs()//取最绝对值
  • a.negate()//取相反数
     
注意

  枚举常量用法摘要

  • CEILING:向正无限大方向舍入的舍入模式
  • DOWN:向零方向舍入的舍入模式
  • FLOOR:向负无限大方向舍入的舍入模式
  • HALF_DOWN:向最接近数字方向舍入的舍入模式,如果与两个响铃数字的距离相等,则向下舍入
  • HALF_EVEN:向最接近你数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向响铃的偶数舍入
  • HALF_UP:向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入
  • UNNECESSARY:用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入
  • UP:远离零方向舍入的舍入模式
关于BigDecimal格式化
public String formatValue(Object value){ 
        String content = null; 
        if (value == null) { 
             content = ""; 
         } else { 
             if(value instanceof BigDecimal){ 
                 //conver to fortmat String 
                 NumberFormat nf = NumberFormat.getInstance(); 
                 nf.setMinimumFractionDigits(2); 
                 nf.setMaximumFractionDigits(2); 
                 content = nf.format(value);  
             }else{ 
                 content = String.valueOf(value); 
             } 
         } 
        return content; 
    } 

 

  • 使用这样一个方法可以达到格式化的效果,下面的setMaximumFractionDigits
    表示小数点后面的精确位数。 
  • NumberFormat的货币格式: 
    • getCurrencyInstance(): 返回当前默认环境的货币格式 
    • getCurrencyInstance(Local local):返回指定货币格式的nubmber对象

    

 

 

        String str = "187";
        str = "187.9";
        BigDecimal strToBigDecimal = new BigDecimal(str);
        BigDecimal strToBigDecimal_0 = new BigDecimal(str, MathContext.UNLIMITED);
        BigDecimal strToBigDecimal_7 = new BigDecimal(str, MathContext.DECIMAL32);
        BigDecimal strToBigDecimal_16 = new BigDecimal(str, MathContext.DECIMAL64);
        BigDecimal strToBigDecimal_34 = new BigDecimal(str, MathContext.DECIMAL128);

        System.out.println(strToBigDecimal);    // 187  ;   187.9
        System.out.println(strToBigDecimal_0);  // 187  ;   187.9
        System.out.println(strToBigDecimal_7);  // 187  ;   187.9
        System.out.println(strToBigDecimal_16); // 187  ;   187.9
        System.out.println(strToBigDecimal_34); // 187  ;  

转载于:https://www.cnblogs.com/xhy-shine/p/9016155.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值