经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
Java开发笔记(八)五种算术运算符
来源:cnblogs  作者:pinlantu  时间:2018/10/11 9:32:35  对本文有异议

计算机科学起源于数学,早期的计算机也确实多用于数学运算,以至于后来的各路编程语言,仍然保留着古老的加减乘除四则运算。这四则运算在Java语言中有专门的运算符加以表示,像加法符号“+”对应Java的“+”,减法符号“-”对应Java的“-”,乘法符号“×”对应Java的“*”,除法符号“÷”对应Java的“/”,除此之外,还有一个求余数运算,在数学上使用mod表示,而Java对应的求余运算符为“%”。四则运算加求余数运算构成了Java编程的基础算术,数字和运算符的书写顺序与大众写法并无差异,下面便是这几种基本运算的代码例子:

  1. int sum = 1+2; // 求两数相加之和
  2. System.out.println("sum="+sum);
  3. int differ = 7-3; // 求两数相减之差
  4. System.out.println("differ="+differ);
  5. int product = 5*6; // 求两数相乘之积
  6. System.out.println("product="+product);
  7. int quotient = 81/9; // 求两数相除之商
  8. System.out.println("quotient="+quotient);
  9. int remainder = 40%3; // 求两数相除之余数
  10. System.out.println("remainder="+remainder);

 

运行以上测试代码,得到如下的运算日志。

  1. sum=3
  2. differ=4
  3. product=30
  4. quotient=9
  5. remainder=1

 

可见上述的运算结果符合平常的加减乘除逻辑。

整数的四则运算看来是波澜不惊,倘若有小数参与运算,计算结果还是一样的吗?接下来先看个除法运算,前面的除法算的是81除以9,因为刚好能除尽,所以求得的商毫无疑义是9。那末换种除不尽的情况,比如说25除以4,按日常生活中的除法,此时求得的商应该是6.25。但是Java语言另有规定,如果被除数和除数都是整型,求得的商也只能是整型数,故而25除以4得到的商变成了6,也就是省略了小数部分。要想让这个商成为包括小数部分的数值,就必须让被除数和除数之一变成小数,只有其中一个是小数,Java才会把整数的除法运算转为小数的除法运算。例如25.0/4、25/4.0、25.0/4.0这几种写法,都将变成双精度类型的除法,最后求得的商也变作了双精度数6.25。下面是前述的除法运算用到的实验代码:

  1. // 被除数和除数都是整数,则求得的商为去掉小数部分的整数
  2. int quotientInt = 25/4;
  3. System.out.println("quotientInt="+quotientInt);
  4. // 被除数和除数只要有一个是浮点或双精度数,则求得的商保留小数部分
  5. double quotientDouble = 25.0/4;
  6. // 25/4.0的运算结果跟25.0/4是一样的
  7. //double quotientDouble = 25/4.0;
  8. System.out.println("quotientDouble="+quotientDouble);

 

运行上面的实验代码,打印出来的运算日志见下。

  1. quotientInt=6
  2. quotientDouble=6.25

然而对小数进行除法运算,有时候计算结果并不精确,譬如以下的测试代码:

  1. // 因为float和double类型自身为约数表示,所以除法运算得到的商也是约数,不能保证小数部分是精确的
  2. double quotientDecimal = 8.1/3;
  3. System.out.println("quotientDecimal="+quotientDecimal);
  4. // 对浮点数和双精度数求余数,也存在约数造成的问题,即余数的小数部分可能并不准确
  5. double remainderDecimal = 5.1%2;
  6. System.out.println("remainderDecimal="+remainderDecimal);

 

这个测试代码的运算很简单,8.1除以3正常求得的商为2.7,至于5.1除以2的余数正常应为1.1。可是一旦运行上述的测试代码,会发现除法结果竟然是下面这样的:

  1. quotientDecimal=2.6999999999999997
  2. remainderDecimal=1.0999999999999996

 

以上得到的商和余数真是叫人目瞪口呆,说好的2.7和1.1怎么走样了呢?其实这种情况在一开始便埋下伏笔了,之前介绍浮点型和双精度型时,提到它们本身并非精准的数值,而是一个尾数乘以10的若干次方,并且浮点型的精度只有6到7位,双精度型的精度则为15-16位,精度以外的数字纯属打酱油的。现在Java对小数进行除法运算,打酱油部分的数字也来凑热闹,本来能除得尽的小数,由于些许的偏差反而变得除不尽了,以至造成画蛇添足的尴尬。这就告诉我们,要谨慎对待小数的除法和取余数运算。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号