Java常用类库:Class BigDecimal

Java常用类库

1、Class BigDecimal

1.1、BigDecimal类的介绍

  BigDecimal类继承了Number类并实现了 Comparable接口,使用该类是需要进行导包操作,该类所属的包为:java.math.BigDecimal。使用BigDecimal类可以进行算术,比例操作,舍入,比较,散列和格式转换等操作。使用该类方法进行以上功能的实现与直接使用运算符进行计算的操作相比的好处就是:可以防止数据在进行计算时丢失精确度。而使用该类进行具体操作时,并不是简单的使用算术运算符(“+”、“-”、“*”、“/” 等)进行计算,而是要创建对象,用对象调用不同的方法来实现相应功能操作,下面就介绍BigDecimal类的各种功能方法。

1.2、BigDecimal类的方法

1.2.1、构造方法

  使用BigDecimal类来实现不同功能需要创建对象来调用方法进行操作。因此,首先就要了解该如何创建对象,即要了解该类的构造方法,该类的构造方法有以下几种:

	BigDecimal​(double val)  //传入一个double类型的参数,该构造方法不推荐使用
	BigDecimal​(int val)  //传入一个int类型的参数
	BigDecimal​(long val)  //传入一个long类型的参数
	BigDecimal​(String val)  //传入一个String类型的参数,比较推荐使用该方法	

  第一种创建方式是将double类型的值转化成BigDecimal类的对象,这种方式不推荐使用,因为数据会失真,下方有效果图,其他方法也是同理,就是将传入的相应类型的值转化成BigDecimal类的对象。如果想要让double类型的值转化成BigDecimal类的对象,可以使用最后一种方法,该方法的不会造成数据失真,下方有效果图。

  以下是具体java代码:

public class BigDecimalTest {
    public static void main(String[] args) {
        BigDecimal b = new BigDecimal("0.238");
        BigDecimal b1 = new BigDecimal(0.238);
        BigDecimal b2 = new BigDecimal(1);
        BigDecimal b3 = new BigDecimal(2L);
        System.out.println("传入String类型的结果:"+b);
        System.out.println("传入Double类型的结果:"+b1);
        System.out.println("传入Int类型的结果:"+b2);
        System.out.println("传入Long类型的结果:"+b3);
    }
}

  控制台运行效果图:

在这里插入图片描述

  从效果图很明显可以看出:传入double类型参数的方法中传入值和输出值的不一致,而传入String类型参数的方法可以准确的输出传入的值,就可以很好的解决数据失真的问题。

  接下来介绍BigDecimal类中实现不同功能的方法

1.2.2、abs方法

  该方法使用后会有一个BigDecimal类型的返回值,作用是:计算对象值的绝对值。

  以下是具体java代码:

public class Test1 {
    public static void main(String[] args) {
        BigDecimal b = new BigDecimal("0.2");
        BigDecimal b1 = new BigDecimal("-0.2");
        System.out.println("b对象调用abs方法后的绝对值为:"+b.abs());
        System.out.println("b1对象调用abs方法后的绝对值为:"+b1.abs());
    }
}

  控制台运行效果图:

在这里插入图片描述

1.2.3、negate方法

  该方法使用后会有一个BigDecimal类型的返回值,作用是:给对象值的首部加一个“-”号(相当于计算相反数)。

  以下是具体java代码:

public class Test2 {
    public static void main(String[] args) {
        BigDecimal b = new BigDecimal("0.2");
        BigDecimal b1 = new BigDecimal("-0.2");
        System.out.println("b对象调用negate方法后的相反数为:"+b.negate());
        System.out.println("b1对象调用negate方法后的相反数为:"+b1.negate());
    }
}

  控制台运行效果图:

在这里插入图片描述

1.2.4、plus方法

  该方法使用后会有一个BigDecimal类型的返回值,作用是:给对象值的首部加一个“+”号。

  以下是具体java代码:

public class Test3 {
    public static void main(String[] args) {
        BigDecimal b =new BigDecimal("0.2");
        BigDecimal b1 = new BigDecimal("-0.2");
        System.out.println("b对象调用plus方法后的值为:"+b.plus());
        System.out.println("b1对象调用plus方法后的值为:"+b1.plus());
    }
}

  控制台运行效果图:

在这里插入图片描述

1.2.5、pow方法

  该方法使用后会有一个类型BigDecimal类型的返回值,使用时需要传入一个int类型的参数,该方法的作用是:进行幂运算,底数为创建对象时传入的参数的值,指数为使用方式是传入的参数的值。注意:传入的参数的范围是:0(包括)~999999999(包括),超出范围时会抛出 ArithmeticException 该类异常。

  以下是具体java代码:

public class Test4 {
    public static void main(String[] args) {
        BigDecimal b =new BigDecimal("3");
        BigDecimal b1 = new BigDecimal("-3");
        System.out.println("b对象调用pow方法后的值为:"+b.pow(2));
        System.out.println("b1对象调用pow方法后的值为:"+b1.pow(0));
    }
}

  控制台运行效果图:

在这里插入图片描述

1.2.6、scaleByPowerOfTen方法

  该方法使用后会有一个BigDecimal类型的返回值,使用时传入一个int类型的参数,作用是:将创建对象时传入的参数乘以一个底数为10,指数为使用方式时传入的参数的值 。

  以下是具体java代码:

public class Test6 {
    public static void main(String[] args) {
        BigDecimal b =new BigDecimal("3");
        System.out.println("使用scaleByPowerOfTen方法后的值为:"+b.scaleByPowerOfTen(5));
    }
}

  控制台运行效果图:

在这里插入图片描述

  不用怀疑效果图的结果,这就是表示3乘以10的5次方的值,这是另一种表达方式:科学计数法的表示方法。

1.2.7、add方法

  该方法使用后会有一个BigDecimal类型的返回值,使用时传入一个BigDecimal类型的参数,作用是:进行加法运算。

  以下是具体java代码:

public class Test5 {
    public static void main(String[] args) {
        BigDecimal b =new BigDecimal("0.25");
        BigDecimal b1 = new BigDecimal("0.3");
        System.out.println("使用add方法后的值为:"+b.add(b1));
    }
}

  控制台运行效果图:

在这里插入图片描述

1.2.8、subtract​方法

  该方法使用后会有一个BigDecimal类型的返回值,使用时传入一个BigDecimal类型的参数,作用是:进行减法运算。

  以下是具体java代码:

public class Test7 {
    public static void main(String[] args) {
        BigDecimal b =new BigDecimal("0.25");
        BigDecimal b1 = new BigDecimal("0.3");
        System.out.println("使用subtract方法后的值为:"+b.subtract(b1));
    }
}

  控制台运行效果图:

在这里插入图片描述

1.2.9、multiply​方法

  该方法使用后会有一个BigDecimal类型的返回值,使用时传入一个BigDecimal类型的参数,作用是:进行乘法运算。

  以下是具体java代码:

public class Test8 {
    public static void main(String[] args) {
        BigDecimal b = new BigDecimal("6");
        BigDecimal b2 = new BigDecimal(52);
        System.out.println("使用multiply方法后的值"+b.multiply(b2));
    }
}

  控制台运行效果图:

在这里插入图片描述

1.2.10、divide​方法

  该方法使用后会有一个BigDecimal类型的返回值,使用时传入一个BigDecimal类型的参数,作用是:进行除法运算。注意:要遵循除数不能为零的原则,所以传入的参数不能使零,不然会抛出 ArithmeticException 该类异常。

  以下是具体java代码:

public class Test9 {
    public static void main(String[] args) {
        BigDecimal b = new BigDecimal("51");
        BigDecimal b2 = new BigDecimal(-6);
        System.out.println("使用divide方法后的值为:"+b.divide(b2));
    }
}

  控制台运行效果图:

在这里插入图片描述

1.2.11、compareTo​方法

  使用该方法后会有一个int类型的返回值,使用时需要传入一个BigDecimal类型的参数,作用是:判断两个值的大小,如果调用方法的对象的值大于传入参数的值则返回1;小于则返回-1;两数相等则返回0。

  以下是具体java代码:

public class Test10 {
    public static void main(String[] args) {
        BigDecimal b = new BigDecimal("51");
        BigDecimal b1 = new BigDecimal(20);
        BigDecimal b2 = new BigDecimal("20");
        System.out.println("b比b1大时使用compareTo方法后的值为:"+b.compareTo(b1));
        System.out.println("b1比b小时使用compareTo方法后的值为:"+b1.compareTo(b));
        System.out.println("b1与b2相同时使用compareTo方法后的值为:"+b1.compareTo(b2));
    }
}

  控制台运行效果图:

在这里插入图片描述

1.2.12、max​方法和min方法

  max方法和min方法都是比较大小的方法,两个方法都有一个BigDecimal类型的返回值,使用都要传入一个BigDecimal类型的参数,max方法的作用是:返回两者中较大的一方;min方法的作用是:返回两者中较小的一方。注意:两方法中如果对象的值和传入参数的值相同,则返回的是对象的值。

  以下是具体java代码:

public class Test11 {
    public static void main(String[] args) {
        BigDecimal b = new BigDecimal("51");
        BigDecimal b2 = new BigDecimal(30);
        System.out.println("使用max方法后的值为:"+b.max(b2));
        System.out.println("使用min方法后的值为:"+b.min(b2));
    }
}

  控制台运行效果图:

在这里插入图片描述

1.2.13、setScale​方法

  该方法使用后会有一个bigDecimal类型的返回值,使用时有两种传参方式:第一种为传入一个int类型的值,作用是:在你指定的位置(小数位开始的第几位)为空时添0,不为空时保持原来的位置的数不变,当你指定的位置后面还存在有数的话,会抛出 ArithmeticException 该类异常;第二种为传入两个参数:第一个参数为int类型的参数,第二个参数为RoundingMode类的字段,作用是:根据你指定的位数(小数后几位)和 RoundingMode类的字段进行相应的进位和舍位的操作。

RoundingMode类的字段说明:
CEILING       舍入模式向正无穷大舍入。
DOWN        舍入模式向零舍入。
FLOOR         舍入模式向负无穷大舍入。
HALF_DOWN     舍入模式向“最近邻居”舍入,除非两个邻居等距,在这种情况下向下舍入。
HALF_EVEN     舍入模式向“最近邻居”舍入,除非两个邻居等距,在这种情况下,向着偶邻居舍入。
HALF_UP       舍入模式向“最近邻居”舍入,除非两个邻居等距,在这种情况下向上舍入。
UNNECESSARY    舍入模式断言所请求的操作具有精确结果,因此不需要舍入。
UP          舍入模式从零开始舍入。

  以下是具体传入一个参数的java代码:

public class Test12 {
    public static void main(String[] args) {
        BigDecimal b = new BigDecimal("51.1");
        BigDecimal b1 = new BigDecimal("2.56");
        System.out.println("传入一个参数的setScale方法的值为:"+b.setScale(2));
        System.out.println("传入一个参数的setScale方法的值为:"+b1.setScale(2));
        System.out.println("传入一个参数的setScale方法的值为:"+b1.setScale(1));
    }
}

  控制台运行效果图:

在这里插入图片描述

  可以看到第三个输出是抛出了异常的,因为我指定的小数位后面还存在有位数,所以会抛异常,大家要注意了。

  以下是具体传入两个参数的java代码:

     BigDecimal b = new BigDecimal("51.1");
        BigDecimal b1 = new BigDecimal("-2.54");
        BigDecimal b2 = new BigDecimal("2.68");
        System.out.println("传入一个参数的setScale方法的值为:"+b.setScale(2));
        System.out.println("传入一个参数的setScale方法的值为:"+b1.setScale(2));
        System.out.println("---------------------------");
        System.out.println("指定字段为:DOWN 的值为"+b1.setScale(1, RoundingMode.DOWN));
        System.out.println("指定字段为:UP 的值为"+b1.setScale(1, RoundingMode.UP));
        System.out.println("指定字段为:CEILING 的值为"+b1.setScale(1, RoundingMode.CEILING));
        System.out.println("指定字段为:FLOOR 的值为"+b1.setScale(1, RoundingMode.FLOOR));
        System.out.println("指定字段为:UNNECESSARY 的值为"+b1.setScale(2,RoundingMode.UNNECESSARY));
        System.out.println("指定字段为:HALF_DOWN 的值为"+b1.setScale(1, RoundingMode.HALF_DOWN));
        System.out.println("指定字段为:HALF_UP 的值为"+b1.setScale(1, RoundingMode.HALF_UP));
        System.out.println("指定字段为:HALF_EVEN 的值为"+b1.setScale(1, RoundingMode.HALF_EVEN));
        System.out.println("---------------------------");
        System.out.println("指定字段为:DOWN 的值为"+b2.setScale(1, RoundingMode.DOWN));
        System.out.println("指定字段为:UP 的值为"+b2.setScale(1, RoundingMode.UP));
        System.out.println("指定字段为:CEILING 的值为"+b2.setScale(1, RoundingMode.CEILING));
        System.out.println("指定字段为:FLOOR 的值为"+b2.setScale(1, RoundingMode.FLOOR));
        System.out.println("指定字段为:UNNECESSARY 的值为"+b2.setScale(4,RoundingMode.UNNECESSARY));
        System.out.println("指定字段为:HALF_DOWN 的值为"+b2.setScale(1, RoundingMode.HALF_DOWN));
        System.out.println("指定字段为:HALF_UP 的值为"+b2.setScale(1, RoundingMode.HALF_UP));
        System.out.println("指定字段为:HALF_EVEN 的值为"+b2.setScale(1, RoundingMode.HALF_EVEN));

  控制台运行效果图:

在这里插入图片描述

  说说我对这些字段的作用的看法:(1)UP字段就是负数会屏蔽负号;不管有没有超过5,都往你所定的小数位进位;(2)DOWN字段就是负数会屏蔽负号;不管有没有低于5,都往你所定的小数位舍位;(3)UNNECESSARY字段相当于你用了一参的方法,效果和一参的一样,会补零,也会保留位数,也会抛异常(我试验过,不过没展示出来,你们自己尝试看看效果)(4)HALF_DOWN、HALF_UP、HALF_EVEN这三个字段我没看出来有啥差别,都是负数会屏蔽负号,过5就进位,不过5就舍位。(5)FLOOR 这个字段是往负无穷大方向舍位。(6)CEILING这个字段是往正无穷大方向进位。

1.2.14、转化成基本类型的方法

  这些方法包括:intValue方法、floatValue方法、longValue方法、doubleValue方法、toString方法,这些方法都是将BigDecimal类对象的值转化成相应的类型。

  以下是具体java代码:

public class Test13 {
    public static void main(String[] args) {
        BigDecimal b = new BigDecimal("5.8");
        int i = b.intValue();
        float v = b.floatValue();
        long l = b.longValue();
        double v1 = b.doubleValue();
        String s = b.toString();
        System.out.println("使用intValue方法后的值为:"+i);
        System.out.println("使用floatValue方法后的值为:"+v);
        System.out.println("使用doubleValue方法后的值为:"+v1);
        System.out.println("使用toString方法后的值为:"+s);
        System.out.println("使用longValue方法后的值为:"+l);
    }
}

  控制台运行效果图:

在这里插入图片描述

  大家看代码就可以知道相同类型之间才可以进行赋值操作,所以转换方法是可以将BigDecimal类对象的值转换成对应的类型。注意:如果对象的是为浮点型,在转换成整型时会将小数点位全部舍去,如果对象的是为整型,转换成浮点型时会在小数点右边第一位添零。

  关于BigDecimal类的相关内容和方法我就介绍到这了,当然方法不止这些,我只是选择性的演示了BigDecimal类中的常用的方法,其它方法感兴趣的小伙伴可以自行百度了解,希望文章可以帮到你们。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值