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
【例11_12】的运行结果如图11-11所示。
图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
【例11_13】的运行结果如图11-12所示。
图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
【例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
【例11_15】的运算结果如图11-14所示。
图11-14【例11_15】运算结果
本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。