第十一章《Java实战常用类》第3节:Math类

时间:2023-01-02 11:59:43

​Math类位于java.lang包下,它提供了很多关于数学计算的方法,这些方法主要包括:计算三角函数的方法、计算指数和对数的方法、对数字进行舍入的方法、求随机数的方法等。这些用于数学计算的方法均被定义为静态方法,除此之外,Math类还以静态属性的形式定义了两个在数学上使用频率非常高的常量,分别是PI和E,它们分别代表圆周率π和自然对数e。

11.3.1 利用三角函数求π值

Math类定义的数学计算方法可以分为很多种类,下面的表11-3列出了Math类关于三角函数的各种方法。​

表11-3 三角函数相关方法​

方法​

作用​

double sin(double a)​

正弦函数,a以弧度表示​

double sinh(double x)​

双曲正弦函数​

double cos(double a)​

余弦函数,a以弧度表示​

double cosh(double x)​

双曲余弦函数​

double tan(double a)​

正切函数,a以弧度表示​

double tanh(double x)​

双曲正切函数​

double asin(double a)​

反正弦函数,a的范围-π/2~π/2​

double acos(double a)​

反余弦函数,a的范围0~π​

double atan(double a)​

反正切函数,a的范围-π/2~π/2​

double toRadians(double angdeg)​

将角度值转换为弧度值​

double toDegrees(double angrad)​

将弧度值转换为角度值​

这些用于计算三角函数的方法用途非常广泛,下面的【例11_12】展示了使用反正切函数求圆周率π值的过程。此处特别说明:使用反正切函数计算圆周率π值的公式有很多,本例采用的计算公式为:​

π/4 = arctan(1/2)+ arctan(1/5)+ arctan(1/8)

【例11_12用反正切函数求π的值】

Exam11_12.java​

public class Exam11_12 {
public static void main(String[] args) {
double r;//用于存储计算结果的变量
r = Math.atan(0.5)+Math.atan(0.2)+Math.atan(0.125);
System.out.println("π="+(4*r));
}
}

【例11_12】的运行结果如图11-11所示。​

第十一章《Java实战常用类》第3节:Math类

图11-11【例11_12】运行结果​

11.3.2实现求任意对数值

Math类提供了8个指数与对数计算相关的方法,如表11-4所示。​

表11-4 指数和对数计算相关方法​

方法

作用

double exp(double a)

返回e的a次方,e是自然对数

double expm1(double x)

返回ex-1

double log(double a)

返回以e为底,a的对数值

double log10(double a)

返回10为底,a的对数值

double log1p(double x)

返回x+1对数值

double pow(double a,double b)

返回a的b次方

double sqrt(double a)

返回a的平方根

double cbrt(double a)

返回a的立方根

表11-4所列出的各种指数和对数的计算方法虽然很多,但是并没有求任意数为底对数值的方法。实际上,只需要利用换底公式就能解决这个问题,换底公式可以表示为:​

lognm = logem/logen

下面的【例11_13】展示了利用换底公式求任意数为底对数值的过程。​

【例11_13求任意数为底对的数值】

Exam11_13.java​

import java.util.Scanner;
public class Exam11_13 {
public static void main(String[] args) {
double n,m,logval;//定义表示底、真数和对数的变量
Scanner sc = new Scanner(System.in);
System.out.println("请输入底:");
n = sc.nextDouble();
System.out.println("请输入真数:");
m = sc.nextDouble();
logval = Math.log(m)/Math.log(n);
System.out.println("以"+n+"为底"+m+"的对数为:"+logval);
}
}

【例11_13】的运行结果如图11-12所示。​

第十一章《Java实战常用类》第3节:Math类

图11-12【例11_13】运行结果​


11.3.3 实现浮点数的舍入操作

Math类中还提供了大量用于对小数进行取整的方法以及求绝对值的方法,如表11-5所示。​

表11-5 取整及求绝对值的方法​

方法

作用

long round(double a)/ int round(float a)

a四舍五入(距离两边相等取大数)

double rint(double a)

a四舍五入(距离两边相等取偶数)

double ceil(double a)

求大于等于a的最小整数

double floor(double a)

求小于等于a的最大整数

double abs(double a)/ float abs(float a)

/单精度浮点数a的绝对值

int abs(int a)/ long abs(long a)

整型/长整型数a的绝对值

int negateExact(int a)/long negateExact(long a)

整型/长整型数a的相反数

需要注意:rint()、ceil()、floor()这3个方法的运算结果虽然都是整数,但它们的返回值类型却都是double。在表11-5所列的这些方法中,round()和rint()这两个方法都是以四舍五入的方式对一个浮点数取整,但它们的运算规则却并不相同。如果一个浮点数与它相邻的两个整数的距离相同,那么round()方法在取整时取较大的整数,而rint()方法则在取整时取偶数。下面的【例11_14】展示了各种取整方法的运算效果。​

【例11_14 取整方法效果演示】

Exam11_14.java​

public class Exam11_14 {
public static void main(String[] args) {
System.out.println("不小于12.5的最小整数:"+Math.ceil(12.5));
System.out.println("不大于12.5的最大整数:"+Math.floor(12.5));
System.out.println("用round()方法对12.5四舍五入取整:"+Math.round(12.5));
System.out.println("用round()方法对-12.5四舍五入取整:"+Math.round(-12.5));
System.out.println("用rint()方法对12.5四舍五入取整:"+Math.rint(12.5));
System.out.println("用rint()方法对-12.5四舍五入取整:"+Math.rint(-12.5));
}
}

【例11_14】的运行结果如图11-13所示。​

第十一章《Java实战常用类》第3节:Math类

图11-13【例11_14】运行结果​

从图11-13可以看出:在一个浮点数与相邻整数距离相等时,round()方法在完成取整操作时都取较大的整数,而rint()方法在完成取整操作时都取偶数。​

Math类虽然提供了对浮点数进行舍入的方法,但这些方法进行舍入的结果都是整数,并不能保留任意的小数位数。如果希望对一个浮点数保留任意的小数位数,必须通过编码实现。这个操作过程的实现原理是:把要保留的这部分小数从小数点的后边移动到小数点的前边,然后再调用round()方法完成舍入,之后再把这些希望保留的小数移动到小数点的后面。例如浮点数12.3456,如果想保留2位小数,可以先把小数点后面的2位小数移动到小数点前边,这样浮点数就变为1234.56,然后调用round()方法对其进行舍入,所得结果为1235,然后把刚才移动到小数点之前的数字移回到小数点后面,最终得到的舍入结果就是12.35。把数字移动到小数点之前可以通过乘以10的N次方实现,同理,把数字移动到小数点之后可以通过除以10的N次方实现。下面的【例11_15】展示了如何实现对浮点数保留任意位数的小数。​

【例11_15 保留任意位小数】

Exam11_15.java​

import java.util.Scanner;
public class Exam11_15 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double num;//要进行舍入的浮点数
int scale;//要保留小数的位数
double temp1;//临时变量1
long temp2;//临时变量2
double result;//最终的运算结果
System.out.println("请输入一个浮点数:");
num = sc.nextDouble();
System.out.println("请输入要保留的小数位数");
scale = sc.nextInt();
temp1 = num*Math.pow(10,scale);//向左移动小数
temp2 = Math.round(temp1);//实现舍入
result = temp2/Math.pow(10,scale);//向右移动小数
System.out.println(num+"保留"+scale+"位小数的结果是:"+result);
}
}

【例11_15】的运算结果如图11-14所示。​

第十一章《Java实战常用类》第3节:Math类

图11-14【例11_15】运算结果​

本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。