当前位置: 首页 > 工具软件 > math-api > 使用案例 >

Java API - Math类-System类-BigDecimal类的常用API

东郭展
2023-12-01

Math类

Math类介绍

包含执行基本数字运算的方法,Math类没有提供公开的构造器。

因为Math类是一个工具类, 不需要创建对象; Math类的成员都是静态的,通过类名就可以直接调用

Math类常用方法

方法名说明
abs(int a)获取参数绝对值
ceil(double a)向上取整
floor(double a)向下取整
round(float a)四舍五入
max(int a,int b)获取两个int值中的较大值
pow(double a,double b)返回a的b次幂的值
random()返回值为double的随机值,范围[0.0,1.0)

演示代码:

public class MathDemo {
    public static void main(String[] args) {
        // 取绝对值
        System.out.println(Math.abs(-100)); // 100
        // 向上取整
        System.out.println(Math.ceil(10.000001)); // 11.0
        // 向下取整
        System.out.println(Math.floor(10.99999)); // 10.0
        // 四舍五入
        System.out.println(Math.round(100.5)); // 101
        System.out.println(Math.round(100.4)); // 100
        // 取两个int的较大值
        System.out.println(Math.max(10, 100)); // 100
        // 返回a的b次幂
        System.out.println(Math.pow(2, 3)); // 8.0
        // 返回一个范围在[0.0, 1.0)之间随机数, 包含0不包含1
        System.out.println(Math.random());
    }
}

System类

System类的概述

System也是一个工具类,代表了当前系统,提供了一些与系统相关的方法。

System类常用方法

方法名说明
exit(int status)终止当前运行的 Java 虚拟机,参数非零表示异常终止
currentTimeMillis()返回当前系统的时间毫秒值形式

exit方法: 终止当前运行虚拟机

public class SystemDemo {
    public static void main(String[] args) {
        System.out.println("程序开始....");
        System.exit(0); // 中转JVM, 后续代码不会执行
        System.out.println("程序结束....");
    }
}

currentTimeMillis方法: 获取当前系统的时间毫秒值, 称为时间毫秒值

计算机认为时间是有起点的,起始时间: 1970年1月1日 00:00:00

时间毫秒值:指的是从1970年1月1日 00:00:00走到此刻的总的毫秒数,应该是很大的。 1s = 1000ms。

原因:

1969年8月,贝尔实验室的程序员肯汤普逊利用妻儿离开一个月的机会,开始着手创造一个全新的革命性的操作系统,他使用B编译语言在老旧的PDP-7机器上开发出了Unix的一个版本。

随后,汤普逊和同事丹尼斯里奇改进了B语言,开发出了C语言,重写了UNIX。

演示代码:

public class SystemDemo2 {
    public static void main(String[] args) {
        long time = System.currentTimeMillis();
        System.out.println(time);
    }
}

BigDecimal类

BigDecimal的作用:

用于解决浮点型运算精度失真的问题

public class BigDecimal {
    public static void main(String[] args) {
        // 浮点型运算的时候直接 加 减 乘 除 可能会出现数据失真(精度问题)。
        System.out.println(0.09 + 0.01); // 0.09999999999999999
        System.out.println(1.0 - 0.32); // 0.6799999999999999
        System.out.println(1.015 * 100); // 101.49999999999999
        System.out.println(1.301 / 100); // 0.013009999999999999

        double c = 0.1 + 0.2;
        System.out.println(c); // 0.30000000000000004
    }
}

BigDecimal使用步骤:

创建对象BigDecimal封装浮点型数据(最好的方式是调用valueOf方法)

public class BigDecimalDemo {
    public static void main(String[] args) {
        double a = 0.11;
        double b = 0.12;
      
        // 将浮点型类型包装为大数据对象
        BigDecimal num1 = BigDecimal.valueOf(a);
        BigDecimal num2 = BigDecimal.valueOf(b);
    }
}

BigDecimal常用API

方法名说明
add(BigDecimal b)加法
subtract(BigDecimal b)减法
multiply(BigDecimal b)乘法
divide(BigDecimal b)除法
divide (另一个BigDecimal对象,精确几位,舍入模式)除法

方法使用演示:

加法add 减法subtract

public class BigDecimalDemo {
    public static void main(String[] args) {
        double a = 0.1;
        double b = 0.2;
        BigDecimal num1 = BigDecimal.valueOf(a);
        BigDecimal num2 = BigDecimal.valueOf(b);
      	// 加法
        System.out.println(num1.add(num2)); // 0.3
      	// 减法
        System.out.println(num1.subtract(num2)); // -0.1
    }
}

乘法multiply 除法divide

public class BigDecimalDemo {
    public static void main(String[] args) {
        double a = 0.1;
        double b = 0.2;
        BigDecimal num1 = BigDecimal.valueOf(a);
        BigDecimal num2 = BigDecimal.valueOf(b);
      	// 乘法
      	System.out.println(num1.multiply(num2)); // 0.02
        // 除法
        System.out.println(num1.divide(num2)); // 0.5
    }
}

我们最终想要得到的类型是double类型, 通过方法doubleValue

public class BigDecimalDemo {
    public static void main(String[] args) {
        double a = 0.1;
        double b = 0.2;
        // 将浮点型类型包装为大数据对象
        BigDecimal num1 = BigDecimal.valueOf(a);
        BigDecimal num2 = BigDecimal.valueOf(b);
        BigDecimal num3 = num1.add(num2);
        // 将BigDecimal转回double类型
        double res = num3.doubleValue();
        System.out.println(res);
    }
}

注意事项: BigDecimal是一定要进行精度运算的(例如下面代码遇到除不尽的情况, 程序就会崩掉)

public class BigDecimalDemo {
    public static void main(String[] args) {
      BigDecimal number1 = BigDecimal.valueOf(10.0);
      BigDecimal number2 = BigDecimal.valueOf(0.3);
      System.out.println(number1.divide(number2)); // 除不尽33.3333...
    }
}

解决方法: 使用divide方法时指定参数divide (另一个BigDecimal对象,精确几位,舍入模式)

舍入模式:

  • 四舍五入: RoundingMode.HALF_UP
  • 向上取整: RoundingMode.CEILING
  • 向下取整: RoundingMode.FLOOR
public class BigDecimalDemo {
    public static void main(String[] args) {
      BigDecimal number1 = BigDecimal.valueOf(10.0);
      BigDecimal number2 = BigDecimal.valueOf(0.3);
      
      // 解决方法, 指定参数
      System.out.println(number1.divide(number2)); // 33.33
    }
}

小结:

BigDecimal的作用是什么?

解决浮点型运算精度失真问题。

BigDecimal的对象如何获取?

通过valueOf方法: BigDecimal b1 = BigDecimal.valueOf(0.1);

 类似资料: