System、BigInteger和BigDecimal类

System类

介绍

        Java的System类是一个非常重要的类,它包含了一系列用于与Java平台交互的静态方法和变量。这些方法和变量被用来访问系统属性、环境变量、标准输入输出流以及进行内存管理等。
        由于System类中的所有方法和变量都是静态的,因此你可以直接通过类名来调用它们,而不需要创建System类的实例。

常用方法

  • System.exit(int x):退出当前程序,其中的参数 x 一般为0,表示正常退出,非零表示异常或错误时退出。
  • System.arraycopy(num1, int a,num2,int b, int x):将指定的源数组 num1 复制指定数量的数组元素到目标数组 num2 的指定位置。
           其中 num1 代表源数组,从该数组中取元素开始复制。
           int a代表从 num1 数组的该索引位置开始复制。
           num2代表目标数组,即复制到该数组中。
           int b代表复制到num2的该索引位置。
           int x表示所需复制的长度(若x不符合逻辑系统会报错)。
        int[] num1 = {1, 2, 3, 4, 5};
        int[] num2 = new int[5];
//一    System.arraycopy(num1,0,num2,0,num1.length);
        //此时数组num2的值:[1,2,3,4,5]
//二    System.arraycopy(num1,1,num2,2,3);
        //此时数组num2的值:[0,0,2,3,4]
//三    System.arraycopy(num1,2,num2,0,3);
        //此时数组num2的值:[3,4,5,0,0]
//四    System.arraycopy(num1,2,num2,0,5);
        //报错

         但该方法不推荐使用,一般使用Arrays.copyOf()方法代替System.arraycopy()方法。

  • System.currentTimeMillis():返回自1970年1月1日00:00:00 GMT(格林尼治标准时间)以来的毫秒数。这个方法常用于计算时间差或生成时间戳。
System.out.println(System.currentTimeMillis());
//输出1722858683310
  • System.gc():请求垃圾回收器执行垃圾回收。在之前学习Object时已有提及,在此不再赘述。注意,这只是个请求,JVM可以忽略它。

BigInteger和BigDecimal类

介绍

        BigInteger和BigDecimal类都是用于处理大数的,但它们的应用场景和内部实现有所不同。这两个类都位于 java.math 包中,因此在使用前需要导入这个包。

        BigInteger类是不可变的,所以对 BigInteger 进行加减乘除时,不能直接进行 + - * / ,需要使用对应的方法。适合存放比较大的整形。

        BigDecimal类也是不可变的,同理也不能直接进行 + - * /, 需要使用对应的方法。适合存放精度更高的浮点型(小数)。

BigInteger常用方法

创建BigInteger对象

//第一种:使用字符串构造方法
BigInteger num1=new BigInteger("1234567899999999");
//或者
String str = "1234567899999999";
BigInteger num2=new BigInteger(str);
//第二种:使用静态工厂方法
BigInteger num3=BigInteger.valueOf(1234567899999999l);

  • BigInteger1.add(BigInteger2):返回两个BigInteger相加的和。
BigInteger num1=new BigInteger("12300000000");
BigInteger num2=new BigInteger("99999");
BigInteger num3=num1.add(num2);//将相加所得的值赋给num3
//此时num3的值为12300099999

  • BigInteger1.subtract(BigInteger2):返回两个BigInteger相减的差。
BigInteger num1=new BigInteger("12300000000");
BigInteger num2=new BigInteger("99999");
num2=num1.subtract(num2);//将相减所得的值赋给num3
//此时num3的值为12299900001

  •  BigInteger1.multiply(BigInteger2):返回两个BigInteger相乘的积。
BigInteger num1=new BigInteger("12300000000");
BigInteger num2=new BigInteger("99999");
num2=num1.multiply(num2);//将相乘所得的值赋给num3
//此时num3的值为1229987700000000

  •  BigInteger1.divide(BigInteger2):返回两个BigInteger相除的商。
BigInteger num1=new BigInteger("12300000000");
BigInteger num2=new BigInteger("99999");
num2=num1.divide(num2);//将相除所得的值赋给num3
//此时num3的值为123001

BigDecimal常用方法

创建BigDecimal对象

        第一种:使用构造方法
这是最直接的方法,你可以通过传递 String、double、long 等类型的参数来调用 BigDecimal 的构造方法。但是,由于 double 类型的精度问题,使用 double参数可能会导致精度不准确。 

//使用构造方法        
BigDecimal num1 = new BigDecimal("1.234567899999999");//使用字符串构造
BigDecimal num3 = new BigDecimal(1.234567899999999d);//使用double构造,丢失了部分精度
//或者
String str = "1.234567899999999";
BigDecimal num2 = new BigDecimal(str);

加减乘除

        其加减乘除和 BigInteger 类相同,在此不再赘述。

        但在运行除法 divide 方法,可能会因为 BigDecimal 保存的精度极高,而结果为无限循环小数,系统陷入死循环,进而抛出异常。
        解决方法也很简单:在调用 divide方法时,使用 BigDecimal.ROUND_CEILING 使结果的精度和被除数一致。

BigDecimal num1 = new BigDecimal("1.23456");
BigDecimal num2 = new BigDecimal("0.7");
System.out.println(num1.divide(num2));//报错,陷入死循环
System.out.println(num1.divide(num2,BigDecimal.ROUND_CEILING));
//正常运行,输出结果1.76366,与被除数精度保持一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值