美文网首页
BigDecimal的用法学习

BigDecimal的用法学习

作者: 盼旺 | 来源:发表于2019-09-21 09:36 被阅读0次

    简介:

    用来对超过16位有效位的数double进行精确的运算,商业计算中要用java.math.BigDecimal

    构造

    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 divisor, int scale, int roundingMode)

    //第一参数表示除数
    //第二个参数表示小数点后保留位数,
    //第三个参数表示舍入模式,只有在作除法运算或四舍五入时才用到舍入模式,具体舍入模式 默认四舍五入
    以下都可以用数字表示 从0开始
    //ROUND_UP    //向远离0的方向舍入
    //ROUND_DOWN    //向零方向舍入
    // ROUND_CEILING    //向正无穷方向舍入
    //ROUND_FLOOR    //向负无穷方向舍入
    //ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6
    //ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
    //ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
     //ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式
    

    常用场景

    1.double精确计算

        public static void main(String[] args) {
            double a = 418.48d;
            double b = 7121.88d;
            BigDecimal a1 = new BigDecimal(String.valueOf(a));
            BigDecimal b1 = new BigDecimal(String.valueOf(b));
            BigDecimal c = a1.add(b1);
            BigDecimal d = b1.divide(a1,0);//四舍五入
            System.out.println(c.doubleValue());
            System.out.println(d.doubleValue());
    //7540.36
    //17.02
        }
    

    2.保留两位小数
    BigDecimal.setScale()方法用于格式化小数点注意这里返回一个BigDecimal对象接受

    setScale(1)表示保留一位小数,默认用四舍五入方式 
    setScale(1,ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 
    setScale(1,ROUND_UP)进位处理,2.35变成2.4 
    setScale(1,ROUND_HALF_UP)四舍五入,2.35变成2.4
    setScaler(1,ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
    setScaler(1,ROUND_CEILING)接近正无穷大的舍入
    setScaler(1,ROUND_FLOOR)接近负无穷大的舍入,数字>0和ROUND_UP作用一样,数字<0和ROUND_DOWN作用一样
    setScaler(1,ROUND_HALF_EVEN)向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
    

    scale()

    scale指的是你小数点后的位数。比如123.456则scale()就是3.
    score()就是BigDecimal类中的方法啊。
    比如:BigDecimal b = new BigDecimal("123.456");
    b.scale(),返回的就是3.
    
        public static void main(String[] args) {
            double num=13.154215;
            BigDecimal a = BigDecimal.valueOf(num);
            System.out.println(a.scale());
            BigDecimal b = a.setScale(2,0);//注意这里返回一个BigDecimal对象接受
            System.out.println(b.doubleValue());
    //        6
    //        13.16
        }
    

    3.小数转与百分比互转
    DecimalFormat是格式为十进制数的NumberFormat的具体子类。 它具有各种功能,旨在使任何地区的数字解析和格式化,包括支持西方,阿拉伯语和印度数字。 它还支持不同类型的数字,包括整数123,定点数123.4,科学记数法1.23E4,百分比12%和货币金额123美元。 所有这些都可以进行本地化

        public static void main(String[] args) {
            String percent="66.60%";
            percent=percent.replace("%","");
            BigDecimal a = new BigDecimal(String.valueOf(percent));
            BigDecimal b = a.divide(BigDecimal.valueOf(100));
            System.out.println(b);//-0.66600000858306884765625
            
            DecimalFormat df = new DecimalFormat("0.00%");
            BigDecimal d = new BigDecimal(0.666);
            String percent2=df.format(d);
            System.out.println(percent2);
    //        0.666
    //        66.60%
        }
    

    更多DecimalFormat格式

    //取一位整数
    System.out.println(new DecimalFormat("0").format(value));
    //取一位整数和两位小数
    System.out.println(new DecimalFormat("0.00").format(value));
    //取两位整数和三位小数,整数不足部分以0填补
    System.out.println(new DecimalFormat("00.000").format(value));
    //取所有整数部分
    System.out.println(new DecimalFormat("#").format(value));
    //以百分比方式计数,并取两位小数
    System.out.println(new DecimalFormat("#.##%").format(value));
    //显示为科学计数法,并取五位小数
    System.out.println(new DecimalFormat("#.#####E0").format(value));
    //显示为两位整数的科学计数法,并取四位小数
    System.out.println(new DecimalFormat("00.####E0").format(value));
    //每三位以逗号进行分隔。
    System.out.println(new DecimalFormat(",###").format(value));
    //将格式嵌入文本
    System.out.println(new DecimalFormat("所传入的格式化参数是:###大小。").format(value));
    

    4.比较大小

        public static void main(String[] args) {
            BigDecimal a = new BigDecimal("1.12");
            BigDecimal b = new BigDecimal("1.11");
            BigDecimal c = new BigDecimal("1.12");
            int result1 = a.compareTo(b);
            int result2 = a.compareTo(c);
            int result3 = b.compareTo(a);
    
            System.out.println(result1);  //1
            System.out.println(result2);  //0
            System.out.println(result3);  //-1
        }
    

    相关文章

      网友评论

          本文标题:BigDecimal的用法学习

          本文链接:https://www.haomeiwen.com/subject/bpvsuctx.html