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类常用方法
方法名 | 说明 |
---|---|
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的作用:
用于解决浮点型运算精度失真的问题
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);