Java常用类及其方法(十)_Math

时间:2022-05-23 19:06:21
本期知识点:
Math

类 Math(java.lang)

public final class Math extends Object

Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

与 StrictMath 类的某些数学方法不同,并非 Math 类所有等价函数的实现都定义为返回逐位相同的结果。此类在不需要严格重复的地方可以得到更好的执行。

默认情况下,很多 Math 方法仅调用 StrictMath 中的等价方法来完成它们的实现。建议代码生成器使用特定于平台的本机库或者微处理器指令(可用时)来提供 Math 方法更高性能的实现。这种更高性能的实现仍然必须遵守 Math 的规范。

实现规范的质量涉及到两种属性,即返回结果的准确性和方法的单调性。浮点 Math 方法的准确性根据 ulp(units in the last place,最后一位的进退位)来衡量。对于给定的浮点格式,特定实数值的 ulp 是包括该数值的两个浮点值的差。当作为一个整体而不是针对具体参数讨论方法的准确性时,引入的 ulp 数用于任何参数最差情况下的误差。如果一个方法的误差总是小于 0.5 ulp,那么该方法始终返回最接近准确结果的浮点数;这种方法就是正确舍入。一个正确舍入的方法通常能得到最佳的浮点近似值;然而,对于许多浮点方法,进行正确舍入有些不切实际。相反,对于 Math 类,某些方法允许误差在 1 或 2 ulp 的范围内。非正式地,对于 1 ulp 的误差范围,当准确结果是可表示的数值时,应该按照计算结果返回准确结果;否则,返回包括准确结果的两个浮点值中的一个。对于值很大的准确结果,括号的一端可以是无穷大。除了个别参数的准确性之外,维护不同参数的方法之间的正确关系也很重要。因此,大多数误差大于 0.5 ulp 的方法都要求是半单调的:只要数学函数是非递减的,浮点近似值就是非递减的;同样,只要数学函数是非递增的,浮点近似值就是非递增的。并非所有准确性为 1 ulp 的近似值都能自动满足单调性要求。

Math类的字段

public static final double E       比任何其他值都更接近 e(即自然对数的底数)的 double 值。
public static final double PI    比任何其他值都更接近 pi(即圆的周长与直径之比)的 double 值。

Math类的成员方法:

public static int abs(int a)   绝对值
public static double ceil(double a)   向上取整
public static double floor(double a)   向下取整
public static double pow(double a, double b)   a的b次幂
public static int max(int a,int b)   求最大值
public static double random()   获取一个随机数:[0.0,1.0)
public static long round(double a)   四舍五入
public static double sqrt(double a)   正平方根

public class MathDemo01 {
public static void main(String[] args) {
//public static final double PI
System.out.println("PI:"+Math.PI);

//public static final double E
System.out.println("E:"+Math.E);

//public static int abs(int a):绝对值
System.out.println("abs:"+Math.abs(100));
System.out.println("abs:"+Math.abs(-100));

//public static double ceil(double a):向上取整
System.out.println("ceil:"+Math.ceil(12.34));
System.out.println("ceil:"+Math.ceil(12.56));

//public static double floor(double a):向下取整
System.out.println("floor:"+Math.floor(12.34));
System.out.println("floor:"+Math.floor(12.56));

//public static double pow(double a, double b):a的b次幂
System.out.println("pow:"+Math.pow(2.0, 3.0));

//public static int max(int a,int b):求最大值
System.out.println("max:"+Math.max(25, 20));
System.out.println("max:"+Math.max(Math.max(50,24), 20));//方法嵌套:不属于递归 (方法调用方法本身的一种现象)

//public static double random():获取一个随机数:[0.0,1.0)
System.out.println("random:"+Math.random());
//求:1-100之间的随机数
System.out.println("random:"+(int)(Math.random()*100+1));


//public static long round(double a):四舍五入
System.out.println("round:"+Math.round(12.34f));//返回整数
System.out.println("round:"+Math.round(12.56F));//小数过0.5进行四舍五入,返回整数

//public static double sqrt(double a):正平方根
System.out.println("sqrt:"+Math.sqrt(4));
}
}

Java常用类及其方法(十)_Math

Math类的练习

import java.util.Scanner;

/*
* 需求:请设计一个方法,可以实现获取任意范围内的随机数。
*
* 分析:
* 1)键盘可以录入两个数据
* int start
* int end
* 2)想办法获取这两个数据之间的随机数
* 写一个功能实现,最终返回的是一个int类型
* 3)输出结果
* */
public class MathDemo02 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner x = new Scanner(System.in);
//录入数据
System.out.println("请输入开始的数:");
int start = x.nextInt();
System.out.println("请输入结束的数:");
int end = x.nextInt();
for(int i = 0 ; i < 20; i ++){
int number = getRandom(start,end);
System.out.println(number);
}
}
private static int getRandom(int start, int end) {
int number = (int)(Math.random()*(end-start+1)+start);
return number;
}

}

Java常用类及其方法(十)_Math