Math类位于java.lang包下,它提供了很多关于数学计算的方法,这些方法主要包括:计算三角函数的方法、计算指数和对数的方法、对数字进行舍入的方法、求随机数的方法等。这些用于数学计算的方法均被定义为静态方法,除此之外,Math类还以静态属性的形式定义了两个在数学上使用频率非常高的常量,分别是PI和E,它们分别代表圆周率π和自然对数e。
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】展示了使用反正切函数求圆周率π值的过程。此处特别说明:使用反正切函数计算圆周率π值的公式有很多,本例采用的计算公式为:
【例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所示。
图11-11【例11_12】运行结果
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所列出的各种指数和对数的计算方法虽然很多,但是并没有求任意数为底对数值的方法。实际上,只需要利用换底公式就能解决这个问题,换底公式可以表示为:
下面的【例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所示。
图11-12【例11_13】运行结果
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所示。
图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所示。
图11-14【例11_15】运算结果