前面介绍了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);

  

Java开发笔记(十一)常见的数学函数的更多相关文章

  1. Java开发笔记(八十一)如何使用系统自带的注解

    之前介绍继承的时候,提到对于子类而言,父类的普通方法可以重写也可以不重写,但是父类的抽象方法是必须重写的,如果不重写,编译器就直接在子类名称那里显示红叉报错.例如,以前演示抽象类用法之时,曾经把Chi ...

  2. Java开发笔记(七十三)常见的程序异常

    一个程序开发出来之后,无论是用户还是程序员,都希望它稳定地运行,然而程序毕竟是人写的,人无完人哪能不犯点错误呢?就算事先考虑得天衣无缝,揣着一笔巨款跑去岛国买了栋抗震性能良好的海边别墅,谁料人算不如天 ...

  3. Java开发笔记(三十一)字符类型的表达

    前面介绍的Java编程,要么是与数字有关的计算,要么是与逻辑有关的推理,充其量只能实现计算器和状态机.若想让Java运用于更广阔的业务领域,就得使其支撑更加血肉丰满的业务场景,而丰满的前提是能够表达大 ...

  4. Java开发笔记(四十二)日历工具的常见应用

    前面介绍了日历工具Calendar的基本用法,乍看起来Calendar与Date两个半斤八两,似乎没有多大区别,那又何苦庸人自扰鼓捣一个新玩意呢?显然这样小瞧了Calendar,其实它的作用大着呢,接 ...

  5. Java开发笔记(一百五十一)Druid连接池的用法

    C3P0连接池自诞生以来在Java Web领域反响甚好,业已成为hibenate框架推荐的连接池.谁知人红是非多,C3P0在大型应用场合中暴露了越来越多的局限性,包括但不限于下列几点:1.C3P0管理 ...

  6. Java开发笔记(一百一十一)POST方式的HTTP调用

    前面介绍了GET方式的HTTP调用,该方式主要用于向服务器索取数据,不管是字符串形式的应答报文,还是二进制形式的网络文件,都属于服务器提供的信息.当然调用方也可以向服务地址传送请求参数,除了通过连接对 ...

  7. Java开发笔记(四十一)日历工具Calendar

    前面的文章提到,Date是Java最早的日期工具,估计当时的设计师是个技术宅男,未经过充分调研就拍脑袋写下了Date的源码,造成该工具存在先天不足,比如getYear方法返回的不是纯正的公元纪年.ge ...

  8. Java开发笔记(五十一)多态的发生场景

    江湖上传闻,面向对象之所以厉害,是因为它拥有封装.继承与多态三项神技,只要三板斧一出,号令天下谁敢不从.前面费了老大的劲才讲清楚封装和继承,那么多态又是怎样的神乎其神呢?下面先通过一个简单的例子来说明 ...

  9. Java开发笔记(六十一)Lambda表达式

    前面介绍了匿名内部类的简单用法,通过在sort方法中运用匿名内部类,不但能够简化代码数量,还能保持业务代码的连续性.只是匿名内部类的结构仍显啰嗦,虽然它省去了内部类的名称,但是花括号里面的方法定义代码 ...

  10. Java开发笔记(七十一)容器工具Collections

    清单作为一组数据的有序队列,它在组织形式上与数组有着某些异曲同工之处,数组有专门的数组工具Arrays来进行加工操作,照理清单也应该配备对应的清单工具.当然容器这个大家族确实拥有自己的容器工具Coll ...

随机推荐

  1. HttpClient 调用WebAPI时,传参的三种方式

    public void Post() { //方法一,传json参数 var d = new { username = " ", password = " ", ...

  2. Java web每天学之Servlet工作原理详情解析

    上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...

  3. Go语言反射reflect

    目录 通过反射获取类型信息 理解反射的类型(Type)与种类(Kind) reflect.Elem() - 通过反射获取指针指向的元素类型 通过反射获取结构体的成员类型 通过反射获取值信息 使用反射值 ...

  4. [Swift]LeetCode209. 长度最小的子数组 | Minimum Size Subarray Sum

    Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...

  5. [Swift]LeetCode970.强整数 | Powerful Integers

    Given two non-negative integers x and y, an integer is powerful if it is equal to x^i + y^j for some ...

  6. 英语笔记3(git)

    一: To create a new branch and switch to it at the same time, you can run the git checkout command wi ...

  7. 基于ipv6的数据抓包

    一.实验拓扑 二.配置过程 以r1为例 R1: R1(config)#int f0/0 R1(config-if)#ipv6 enable R1(config-if)#ipv6 address 200 ...

  8. php内核一些常识

    整个PHP环境和Zend环境会涉及多个全局变量,下面是几个比较重要的: php_core_globals core_globals(main/php_globals.h) ==> PG PHP调 ...

  9. 剖析项目多个logback配置(上)

    来源:http://www.cnblogs.com/guozp/p/5949744.html 以下两个是我在使用slf4j + logback时候日志提示的问题,问题不大,都是WARN,并不真正影响运 ...

  10. C# 使用 HttpClient 调用 WebService 提示 NoSOAPAction

    问题 在自行构造 HttpClient 请求 SOAP 接口之后,返回 500 错误,并且提示 NoSOAPAction 信息. 原因 造成这个问题的主要原因是因为缺少了 SOAPAction 标头, ...