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


    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

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

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

    log_{n}m = log_{e}m/log_{e}n

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

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

    Exam11_13.java

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

    【例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

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

    【例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

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

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

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

    除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

  • 相关阅读:
    kuka协作机器人LBR系列 issy15R930导入到ros2_rviz(带外观文件)
    安卓系统--翻译手机rom语言 添加多国语言 编译apk 反编译ODEX 工具步骤解析
    AndroidTV开发12——大屏TV电视及盒子Apk远程安装说明文档
    9.28 - 每日一题 - 408
    机器人制作开源方案 | 管内检测维护机器人
    2022债市波动分析
    【Edibat 算法 ★★★★★★】【吸血鬼数字】Vampire Numbers
    在Qt创建的UI中放一个显示点云的窗口(PCL+QT5)
    pgz-sbv-gf极狐低代码平台发布
    Lecture1:从图像分类引出概念
  • 原文地址:https://blog.csdn.net/shalimu/article/details/128081722