Java高级编程--常用类之System&Math&BigInteger&BigDecimal

前面介绍了较为常用的几种Java的常用类:字符串相关类、日期相关类和比较器相关类,本篇博客将介绍其他的几种常用类,虽不如前面几种使用频繁,但还是需要了解和熟悉的。


目录:

☍ System类

☍ Math类

☍ BigInteger和BigDecimal


☍ System类

System类代表系统相关的类,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。

由于System类的特殊性,该类的构造器是private的,所以无法在外部实例化该类,但其内部的成员变量和成员方法都是static的,这就方便了使用者们的使用。

成员变量

☄ System类内部包含in、out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。如我们最常用的控制台输出语句:System.out.println()

成员方法

native long currentTimeMillis():该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数,相当于new Date().getTime()。

void exit(int status):该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等。

void gc():该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。

String getProperty(String key):该方法的作用是获得系统中属性名为key的属性对应的值。系统中常见的属性名以及属性的作用如下表所示:

属性名 说明
java.version Java运行时环境版本
java.home Jdk安装目录
os.name 操作系统名称
os.version 操作系统版本
user.name 系统用户名
user.home 系统用户主目录
user.dir 当前项目工作目录

代码:

 public void testSystem(){
        String javaVersion = System.getProperty("java.version");
        System.out.println("Java运行时环境版本javaVersion:" + javaVersion);

        String javaHome = System.getProperty("java.home");
        System.out.println("Jdk安装目录javaHome:" + javaHome);

        String osName = System.getProperty("os.name");
        System.out.println("操作系统名称osName:" + osName);

        String osVersion = System.getProperty("os.version");
        System.out.println("操作系统版本osVersion:" + osVersion);

        String userName = System.getProperty("user.name");
        System.out.println("系统用户名userName:" + userName);

        String userHome = System.getProperty("user.home");
        System.out.println("系统用户主目录userHome:" + userHome);

        String userDir = System.getProperty("user.dir");
        System.out.println("当前项目工作目录userDir:" + userDir);
}

☍ Math类

java.lang.Math提供了一系列静态static方法用于数学计算。其方法的参数和返回为值类型一般为double

函数 说明
static double abs(double a) 绝对值
static double sin(double a):acos,asin,atan,cos,sin,tan 三角函数
static double sqrt(double a) 平方根
static double pow(double a, double b) a 的b 次幂
static double log(double a) log 自然对数
static double exp(double a) e 为底a为指数
static double max(double a, double b) 求两个数的最大值
static double min(double a, double b) 求两个数的最小值
static double random() 0.0 到1.0 的随机数
static long round(double a) 四舍五入double➝long
static double ceil(double a) 向上取整
static double floor(double a) 向下取整
toDegrees(double angrad) 弧度—> 角度
toRadians(double angdeg) 角度—> 弧度

代码:

public void testMath(){
     //abs 绝对值
     System.out.println("-4.2的绝对值:" + Math.abs(-4.2));   //输出:4.2

     //acos,asin,atan,cos,sin,tan 三角函数
     System.out.println("sin30的绝对值:" + Math.sin((1.0/6)*Math.PI));   //输出:0.49999999999999994
     System.out.println("arcsin(1/2)的绝对值:" + Math.asin(0.5));  //输出:0.5235987755982989

     //sqrt 平方根
     System.out.println("144的平方根:"+Math.sqrt(144));  //输出:12.0

     //pow(double a,doble b) a 的b 次幂
     System.out.println("2的3次幂:"+Math.pow(2,3));  //输出:8.0

     //log 自然对数
     System.out.println("log2.718:"+Math.log(2.718281828459045)); //输出:1.0

     //exp e 为底a为指数
     System.out.println("e^1:"+Math.exp(1));  //输出:2.718281828459045

     //max(double a,double b)  求两个数的最大值
     System.out.println("14和3.2的最大值:"+Math.max(14,3.2));  //输出:14.0

     //min(double a,double b)  求两个数的最小值
     System.out.println("14和3.2的最小值:"+Math.min(14,3.2));  //输出:3.2

     //random() 返回0.0 到1.0 的随机数
     System.out.println("0-1的随机数:"+Math.random()); //输出:0.6852038863540545

     //long round(double a) double 型数据a 转换为long型(四舍五入)
     System.out.println("4.56四舍五入:" + Math.round(4.76));  //输出:5

     //ceil(double a)  向上取整   double
     System.out.println("3.12向上取整:" + Math.ceil(3.12));  //输出:4.0

     //floor(double a)  向下取整 double
     System.out.println("4.82向下取整:"+ Math.floor(4.82));  //输出:4.0

     //toDegrees(double angrad) 弧度—> 角度
     //toRadians(double angdeg) 角度—> 弧度
}

☍ BigInteger和BigDecimal

Integer类作为int的包装类,能存储的最大整型值为2 31 -1,Long类也是有限的,最大为2 63 -1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类都无能为力,更无法进行数学计算。

▾ BigInteger

java.math包的BigInteger 可以表示不可变的任意精度的整数。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法(见上Math类)。

BigInteger还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作

构造器

☄ BigInteger(String val):根据字符串构建BigInteger对象

常用方法

♩ public BigInteger abs():绝对值,返回绝对值的BigInteger

♪ BigInteger add(BigInteger val) :加法,返回值为 (this + val)

♪ BigInteger subtract(BigInteger val) :减法,返回值为 (this - val)

♬ BigInteger multiply(BigInteger val) :乘法,返回值为 (this * val)

♫ BigInteger divide(BigInteger val) :除法,返回值为 (this / val) 的 BigInteger。整数相除只保留整数部分。

♩ BigInteger remainder(BigInteger val):取余,返回值为 (this % val)

♫ BigInteger[] divideAndRemainder(BigInteger val):返回包含 (this / val) 后跟(this % val) 的两个 BigInteger 的数组。

♩ BigInteger pow(int exponent) :指数,幂值,返回其值为 (this ^exponent )

public void testBigInteger() throws ParseException {
    //BigInteger构造器
    BigInteger bigInteger = new BigInteger("-23523535335");
    BigInteger bigInteger1 = new BigInteger("1234623623623");
    BigInteger bigInteger2 = new BigInteger("4235");
    
    //abs()绝对值
    System.out.println("绝对值:" + bigInteger.abs());
    //绝对值:23523535335

    //add()加法
    BigInteger add = bigInteger1.add(bigInteger2);
    System.out.println("bigInteger1+bigInteger=" + add);
    //bigInteger1+bigInteger=1234623627858

    //add()减法
    BigInteger sub = bigInteger1.subtract(bigInteger2);
    System.out.println("bigInteger1-bigInteger2=" + sub);
    //bigInteger1-bigInteger2=1234623619388

    //multiply()乘法
    BigInteger multiply = bigInteger1.multiply(bigInteger2);
    System.out.println("bigInteger1*bigInteger2=" + multiply);
    //bigInteger1*bigInteger2=5228631046043405

    //divide()除法
    BigInteger divide = bigInteger1.divide(bigInteger2);
    System.out.println("bigInteger1/bigInteger2=" + divide);
    //bigInteger1/bigInteger2=291528600

    //remainder()取余
    BigInteger remainder = bigInteger1.remainder(bigInteger2);
    System.out.println("bigInteger1%bigInteger2=" + remainder);
    //bigInteger1%bigInteger2=2623

    //(this / val) 后跟(this % val) 的两个 BigInteger 的数组。
    BigInteger[] divideAndRemainder = bigInteger1.divideAndRemainder(bigInteger2);
    System.out.println(divideAndRemainder[0] + "--" + divideAndRemainder[1]);
    //291528600--2623

    //pow()幂指函数
    BigInteger pow = bigInteger2.pow(2);
    System.out.println("bigInteger2 ^ 2=" + pow);
    //bigInteger2 ^ 2=17935225
}

▾ BigDecimal

一般的Float类和Double类可完成大多数小数的表示和计算,但在某些商业、工业或科学计算中要求数字精度比较高,此时可选择使用java.math.BigDecimal类。

构造器

☄ public BigDecimal(double val)

☄ public BigDecimal(String val)

常用方法

♩ public BigDecimal add(BigDecimal augend):加法,返回值为 (this + augend)

♫ public BigDecimal subtract(BigDecimal subtrahend):减法,返回值为 (this - subtrahend)

♪ public BigDecimal multiply(BigDecimal multiplicand):乘法,返回值为 (this * multiplicand)

♬ public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode):除法,返回值为 (this / divisor) 的 BigInteger。scale为保留的小数位数,roundingMode为保留小数的模式(四舍五入/向上取整/向下取整) 

public void testBigDecimal() {
     //BigDecimal构造器
     BigDecimal bd1 = new BigDecimal("3.1415926");  //3.1415926
     BigDecimal bd2 = new BigDecimal(2020.0123456789);
     //2020.012345678899919221294112503528594970703125,传入double小数结果不会具体到该小数
     BigDecimal bd3 = new BigDecimal(2020);  //2020
     System.out.println(bd1 + "
" + bd2 + "
" + bd3);

     //add()加法
     BigDecimal add = bd2.add(bd1);
     System.out.println(add);  //2023.153938278899919221294112503528594970703125

     //subtract()减法
     BigDecimal sub = bd2.subtract(bd3);
     System.out.println(sub);  //0.012345678899919221294112503528594970703125

     //multiply()乘法
     BigDecimal mul = bd3.multiply(bd1);
     System.out.println(mul);  //6346.0170520

     //divide()除法
    // BigDecimal div = bd2.divide(bd3);  //报错,需要指定保留模式
     BigDecimal div = bd2.divide(bd3,6,BigDecimal.ROUND_CEILING);
     System.out.println(div);  //1.000007
 }

▾ 保留小数位数

☄ 使用String类的format()方法将数字格式化为指定格式达到保留小数的目的,默认四舍五入,%.nf,n为要保留的小数位数,返回字符串

☄ 转换为BigDecimal对象然后使用setScale()方法设置保留位数,可指定保留模式(四舍五入、向上保留,向下保留等),返回BigDecimal

☄ 使用DecimalFormat类对象df,调用format(BigDecimal b)转换为指定位数,返回字符串

public void testScale() throws ParseException {
    //调用String.format()格式化数字达到保留指定小数的目的,结果为String类型,默认四舍五入
    double dNum = 6.64968;
      System.out.println("String.format('%.2f',6.64968)="+String.format("%.2f",dNum)); //6.65

    BigDecimal bigDecimal = new BigDecimal(51561561.6554144);

    //向下取整小数点后指定位:bigDecimal.setScale(精确位,BigDecimal.ROUND_CEILING);
    //四舍五入:BigDecimal.ROUND_HALF_UP   BigDecimal.ROUND_HALF_DOWN              
             //BigDecimal.ROUND_HALF_EVEN
    //向上保留:ROUND_CEILING
    //向下保留:ROUND_FLOOR
    System.out.println("-----------BigDecimal精确小数点----------");
    BigDecimal bigDecimal1 = bigDecimal.setScale(2,BigDecimal.ROUND_CEILING);
    System.out.println("51561561.6554144保留两位小数:" + bigDecimal);     
    //51561561.655414402484893798828125
    System.out.println(bigDecimal1);   //51561561.66

    DecimalFormat df = new DecimalFormat("0.0000");
    //格式化BigDecimal对象为字符串
    String d1 = df.format(bigDecimal);  //默认四舍五入
    System.out.println("格式化51561561.6554144:" + d1);   //51561561.6554
    //字符串解析为Number对象,再调用xxxValue()方法转为对应基本数据类型
    Number num1 = df.parse("614646.5565");
    System.out.println("解析614646.5565:"+num1.doubleValue());
    //类似SimpleDateFormat的用法
}

本博客与CSDN博客༺ཌ༈君☠纤༈ད༻同步发布

原文地址:https://www.cnblogs.com/asio/p/13703764.html