前面介绍了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. async ,await 有图有真相

    1.async返回的一定是promise对象 2.await确实可以同步:

  2. topic的leader显示为none的解决办法

    1.查看kafka的topic详细信息 bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --topic test --describe 配置delete. ...

  3. 访问不了虚拟机 ubuntu中的myql,解决方案

    ============================================================== 1. 现象 2. 原因分析 2.1 访问虚拟机中的mysql的前提: 你的 ...

  4. 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(5)

    八.KVM 这一步,像virsh start命令一样,将虚拟机启动起来了.虚拟机启动之后,还有很多的步骤需要完成. 步骤38:从DHCP Server获取IP 有时候往往数据库里面,VM已经有了IP, ...

  5. MySQL 千万级 数据库或大表优化

    首先考虑如下因素: 1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节: 2.数据项:是否有大字段,那些字段的值是否经常被更新: 3.数据查询SQL条件:哪些数据项的列名称经常出现在WH ...

  6. PHPWord导出word文档

    最近接了个把数据导出到word文档的需求,之前一直都是使用PHPExcel库导出excel的,还是头次接到导出到word文档的需求,我想既然有PHPExcel,那么肯定也会有PHPWord库吧,在网上 ...

  7. 还在使用SimpleDateFormat?你的项目崩没?

    如果是在多线程环境下,就需要注意了. 要点: 1.加Synchronized同步: 2.使用ThreadLocal: 3.jdk8使用DateTimeFormatter替代SimpleDateForm ...

  8. Linux清空文件内容

    日志文件太多,需要清空: echo "" > mylog.log

  9. .NET Core实战项目之CMS 第十三章 开发篇-在MVC项目结构介绍及应用第三方UI

    作为后端开发的我来说,前端表示真心玩不转,你如果让我微调一个位置的样式的话还行,但是让我写一个很漂亮的后台的话,真心做不到,所以我一般会选择套用一些开源UI模板来进行系统UI的设计.那如何套用呢?今天 ...

  10. 说一说MVC的CompressActionFilterAttrubute(五)

    通过action对文件流压缩,提高带宽速度!!! 引用using System.IO.Compression; public override void OnActionExecuting(Actio ...