欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java开发笔记(十一)常见的数学函数

程序员文章站 2022-03-26 09:22:50
前面介绍了Java编程的四则运算,虽然提供了基础的加减乘除符号,但是数学上还有其它运算符号,包括四舍五入用到的约等号≈、求绝对值的“| |”、开平方的“√ ̄”,这些运算符形态各异,而且并非ASCII码的基本字符,也就意味着它们无法原样搬到Java来。为此,Java的设计师封装了一套数学函数库Math ......

前面介绍了java编程的四则运算,虽然提供了基础的加减乘除符号,但是数学上还有其它运算符号,包括四舍五入用到的约等号≈、求绝对值的“| |”、开平方的“√ ̄”,这些运算符形态各异,而且并非ascii码的基本字符,也就意味着它们无法原样搬到java来。
为此,java的设计师封装了一套数学函数库math,把加减乘除以外的常见数学运算都纳入,然后作为math库的函数方法提供给程序员调用。比如四舍五入变成了math库的round方法,取绝对值变成了math库的abs方法,math库另外提供了取整方法floor和ceil。其中floor方法指的是将变量往下取整,也就是往数值小的方向取整;ceil方法指的是将变量往上取整,也就是往数值大的方向取整。
需要注意的是,如果变量值为负数(假设x=-9.9),那么对x做floor取整将得到-10,对x做ceil取整将得到-9,这种情况与常人理解的正数取整并不相同。假设变量值为正数(如x=9.9),则对x做floor向下取整将得到9,对x做ceil向上取整将得到10。负数的取整结果看似有悖常理,其实完全没有毛病,因为floor方法取的是数值更小的整数,而ceil方法取的是数值更大的整数。既然-10<-9.9<-9,于是floor取整得到了数值更小的-10,而ceil取整得到了数值更大的-9。若想眼见为实的话,则可运行下面的测试代码加以验证:

		double decimalpositive = 9.9;
		// 四舍五入
		long roundpositive = math.round(decimalpositive);
		system.out.println("roundpositive="+roundpositive);
		// 往下取整,也就是往数值小的方向取整
		double floorpositive = math.floor(decimalpositive);
		system.out.println("floorpositive="+floorpositive);
		// 往上取整,也就是往数值大的方向取整
		double ceilpositive = math.ceil(decimalpositive);
		system.out.println("ceilpositive="+ceilpositive);
		double decimalnegative = -9.9;
		// 四舍五入
		long roundnegative = math.round(decimalnegative);
		system.out.println("roundnegative="+roundnegative);
		// 往下取整,也就是往数值小的方向取整
		double floornegative = math.floor(decimalnegative);
		system.out.println("floornegative="+floornegative);
		// 往上取整,也就是往数值大的方向取整
		double ceilnegative = math.ceil(decimalnegative);
		system.out.println("ceilnegative="+ceilnegative);
		// 取绝对值
		double absolutevalue = math.abs(decimalnegative);
		system.out.println("absolutevalue="+absolutevalue);

  

科学计算上常常还需要开平方、幂运算、求对数等复杂函数,java自带的math库也提供了相应的方法,例如sqrt方法对应开平方运算,pow方法对应求某数的n次方,exp方法对应求自然常数e的n次方,log方法对应求自然对数的运算(即exp方法的逆运算),log10方法对应求底数为10的对数。这些方法的详细调用代码如下所示:

		double nine = 9;
		// 开平方。对应数学符号√ ̄
		double sqrt = math.sqrt(nine);
		system.out.println("sqrt="+sqrt);
		// 求n次方。pow的第一个参数为幂运算的底数,第二个参数为幂运算的指数
		double pow = math.pow(nine, 2);
		system.out.println("pow="+pow);
		double five = 5;
		// 求自然常数e的n次方
		double exp = math.exp(five);
		system.out.println("exp="+exp);
		// 求自然对数,为exp方法的逆运算。对应数学函数lnn
		double log = math.log(exp);
		system.out.println("log="+log);
		// 求底数为10的对数。对应数学函数logn
		double log10 = math.log10(100);
		system.out.println("log10="+log10);

  

除了代数运算的常见函数之外,math库还提供了几何方面的三角函数运算,包括正弦、余弦、正切、反正弦、反余弦、反正切都能找到对应的math方法。不过math库的三角方法与几何上的三角函数用法有所不同,几何的三角函数如sin、cos,后面跟着角度的数值,而math库的三角方法跟着是弧度的数值。所谓弧度指的是该角度对应的圆弧长度比去圆的半径,即:弧度=弧长/半径=(角度/360)*2πr/r=角度*π/180。搞清楚了弧度与角度之间的关系,利用math库进行各种三角运算就简单了,下面是这些三角方法的调用代码例子:

		// 三角函数的角度
		double angle = 60;
		// 弧度=该角度对应的弧长/半径
		double radian = angle*math.pi/180;
		// 求某弧度的正弦。求反正弦要调用asin方法
		double sin = math.sin(radian);
		system.out.println("sin="+sin);
		// 求某弧度的余弦。求反余弦要调用acos方法
		double cos = math.cos(radian);
		system.out.println("cos="+cos);
		// 求某弧度的正切。求反正切要调用atan方法
		double tan = math.tan(radian);
		system.out.println("tan="+tan);
		// 求某弧度的余切。math库未提供求余切值的方法,其实余切值就是正切值的倒数
		double ctan = 1.0/tan;
		system.out.println("ctan="+ctan);