首页 > 编程语言 >第十一章《Java实战常用类》第3节:Math类

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

时间:2023-01-02 12:02:12浏览次数:52  
标签:11 Java 第十一章 System double println 方法 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​

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类_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类_Math_02

图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类_Math_03

图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类_Math_04

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

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

标签:11,Java,第十一章,System,double,println,方法,Math
From: https://blog.51cto.com/mugexuetang/5983563

相关文章

  • 第十一章《Java实战常用类》第4节:Random类
    ​在很多程序当中都要用到随机数。例如某个软件在登录时需要填写一个四位数的验证码,这个验证码就是一个典型的随机数。位于java.util包下的Random类是一个专门用于生成随机......
  • JavaScript-变量
    JavaScript变量目录JavaScript变量1.变量概述1.1什么是变量1.2变量在内存中的存储2.变量的使用3.变量语法扩展1.更新变量2.同时声明多个变量3.声明变量特殊情况4.......
  • 第十一章《Java实战常用类》第5节:UUID类
    ​有时候程序员需要用一个的字符串来给数据当作唯一标识。例如,很多大型电商系统每分钟就有可能产生上万条交易数据,如果每条数据都需要和其他数据区分开,程序员就要给每条数据......
  • java通过webdav实现文件上传
    importio.swagger.annotations.*;importorg.apache.http.HttpEntity;importorg.apache.http.auth.AuthScope;importorg.apache.http.auth.Credentials;importorg......
  • java接口了解
    packagecom.zls.demo1_接口的定义;publicinterfaceIA{//常量默认修饰符是publicstaticfinal这3个修饰符可以省略不写publicstaticfinalint......
  • 初识JavaScript-概念,注释,js输入和输出语句
    初识JavaScript目录初识JavaScript1.初识JavaScript1.1JavaScript是什么1.1JavaScript是什么1.2JavaScript的作用1.3HTML/CSS/JS的关系1.4浏览器执行JS简介......
  • 用jar命令打包java中class文件
    用jar命令打包java中class文件:1、不指定MANIFEST.MFjar-cvfMyTreeSet.jarcom/wlk/fuxi0101/*.class2、指定MANIFEST.MF2.1、MANIFEST.MF文件内容如下:Manifest-Version:......
  • JavaScript
    弹框<!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title></title> <scripttype="text/javascript"> //1.弹出提示框 //alert("aaa"); //......
  • Java中动态代理技术生成的类与原始类的区别 (good)
    用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑.平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类......
  • 第十章《日期与时间》第3节:Java8新日期时间系统简介
    ​Date和Calender都是早期Java项目中用于处理日期和时间的工具类,这两个类在设计上有一些明显的缺陷,这些缺陷主要包括:用于计算日期时间的方法较少、线程不安全、对象中的月份......