Java开发笔记(八)五种算术运算符
计算机科学起源于数学,早期的计算机也确实多用于数学运算,以至于后来的各路编程语言,仍然保留着古老的加减乘除四则运算。这四则运算在Java语言中有专门的运算符加以表示,像加法符号“+”对应Java的“+”,减法符号“-”对应Java的“-”,乘法符号“×”对应Java的“*”,除法符号“÷”对应Java的“/”,除此之外,还有一个求余数运算,在数学上使用mod表示,而Java对应的求余运算符为“%”。四则运算加求余数运算构成了Java编程的基础算术,数字和运算符的书写顺序与大众写法并无差异,下面便是这几种基本运算的代码例子:
int sum = 1+2; // 求两数相加之和
System.out.println("sum="+sum);
int differ = 7-3; // 求两数相减之差
System.out.println("differ="+differ);
int product = 5*6; // 求两数相乘之积
System.out.println("product="+product);
int quotient = 81/9; // 求两数相除之商
System.out.println("quotient="+quotient);
int remainder = 40%3; // 求两数相除之余数
System.out.println("remainder="+remainder);
运行以上测试代码,得到如下的运算日志。
sum=3
differ=4
product=30
quotient=9
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。下面是前述的除法运算用到的实验代码:
// 被除数和除数都是整数,则求得的商为去掉小数部分的整数
int quotientInt = 25/4;
System.out.println("quotientInt="+quotientInt);
// 被除数和除数只要有一个是浮点或双精度数,则求得的商保留小数部分
double quotientDouble = 25.0/4;
// 25/4.0的运算结果跟25.0/4是一样的
//double quotientDouble = 25/4.0;
System.out.println("quotientDouble="+quotientDouble);
运行上面的实验代码,打印出来的运算日志见下。
quotientInt=6
quotientDouble=6.25
然而对小数进行除法运算,有时候计算结果并不精确,譬如以下的测试代码:
// 因为float和double类型自身为约数表示,所以除法运算得到的商也是约数,不能保证小数部分是精确的
double quotientDecimal = 8.1/3;
System.out.println("quotientDecimal="+quotientDecimal);
// 对浮点数和双精度数求余数,也存在约数造成的问题,即余数的小数部分可能并不准确
double remainderDecimal = 5.1%2;
System.out.println("remainderDecimal="+remainderDecimal);
这个测试代码的运算很简单,8.1除以3正常求得的商为2.7,至于5.1除以2的余数正常应为1.1。可是一旦运行上述的测试代码,会发现除法结果竟然是下面这样的:
quotientDecimal=2.6999999999999997
remainderDecimal=1.0999999999999996
以上得到的商和余数真是叫人目瞪口呆,说好的2.7和1.1怎么走样了呢?其实这种情况在一开始便埋下伏笔了,之前介绍浮点型和双精度型时,提到它们本身并非精准的数值,而是一个尾数乘以10的若干次方,并且浮点型的精度只有6到7位,双精度型的精度则为15-16位,精度以外的数字纯属打酱油的。现在Java对小数进行除法运算,打酱油部分的数字也来凑热闹,本来能除得尽的小数,由于些许的偏差反而变得除不尽了,以至造成画蛇添足的尴尬。这就告诉我们,要谨慎对待小数的除法和取余数运算。
Java开发笔记(八)五种算术运算符的更多相关文章
- Java开发笔记(五十)几种开放性修饰符
前面介绍子类继承父类的时候,提到了public(公共)和private(私有)两个修饰符,其中public表示它所修饰的实体是允许外部访问的:而private表示它所修饰的实体不允许外部访问,只能在当 ...
- Java开发笔记(五十八)简单接口及其实现
前面介绍了抽象方法及抽象类的用法,看似解决了不确定行为的方法定义,既然叫唤动作允许声明为抽象方法,那么飞翔.游泳也能声明为抽象方法,并且鸡类涵盖的物种不够多,最好把这些行为动作扩展到鸟类这个群体,于是 ...
- Java开发笔记(五十一)多态的发生场景
江湖上传闻,面向对象之所以厉害,是因为它拥有封装.继承与多态三项神技,只要三板斧一出,号令天下谁敢不从.前面费了老大的劲才讲清楚封装和继承,那么多态又是怎样的神乎其神呢?下面先通过一个简单的例子来说明 ...
- Java开发笔记(五十二)对象的类型检查
前面介绍了类的多态性,来自于鸡类的实例chicken,既能用来表达公鸡实例,也能用来表达母鸡实例.可是这导致了一个问题,假如在call方法内部需要手工判断输入参数属于公鸡实例还是母鸡实例,那该如何是好 ...
- Java开发笔记(五十三)关键字final的用法
前面介绍了多态的相关用法,可以看到一个子类从父类继承之后,便能假借父类的名义到处晃悠.这种机制在正常情况之下没啥问题,但有时为了预防意外发生,往往只接受当事人来处理,不希望它的儿子乃至孙子来瞎掺和.可 ...
- Java开发笔记(五十四)内部类和嵌套类
通常情况下,一个Java代码文件只定义一个类,即使两个类是父类与子类的关系,也要把它们拆成两个代码文件分别定义.可是有些事物相互之间密切联系,又不同于父子类的继承关系,比如一棵树会开很多花朵,这些花儿 ...
- Java开发笔记(五十五)关键字static的用法
前面介绍嵌套类的时候讲到了关键字static,用static修饰类,该类就变成了嵌套类.从嵌套类的用法可知,其它地方访问嵌套类之时,无需动态创建外层类的实例,直接创建嵌套类的实例就行.其实static ...
- Java开发笔记(五十六)利用枚举类型实现高级常量
前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...
- Java开发笔记(五十七)因抽象方法而产生的抽象类
前面介绍了类的常见用法,令人感叹面向对象的强大,几乎日常生活中的所有事物,都可以抽象成Java的基类及其子类.然而抽象操作也有副作用,就是某个抽象而来的行为可能是不确定的,比如半夜鸡叫,如果是公鸡则必 ...
- Java开发笔记(五十九)Java8之后的扩展接口
前面介绍了接口的基本用法,有心的朋友可能注意到这么一句话“在Java8以前,接口内部的所有方法都必须是抽象方法”,如此说来,在Java8之后,接口的内部方法也可能不是抽象方法了吗?之所以Java8对接 ...
随机推荐
- scala Weak Conformance
Weak Conformance In some situations Scala uses a more general conformance relation. A type S weakly ...
- Java 短信发送
package com.test; import org.apache.commons.httpclient.Header;import org.apache.commons.httpclient.H ...
- three.js的wave特效(ivew官网首页波浪特效实现)
查看效果请访问:https://521lbx.github.io/Web3D/index.html公司的好几个vue项目都是用ivew作为UI框架,所以ivew官网时不时就得逛一圈.每一次进首页都会被 ...
- FluentDataflow - Fluent Style TPL Dataflow
我的新英文博客文章: FluentDataflow - Fluent Style TPL Dataflow 介绍了本人最新发布的一个开源类库:FluentDataflow--Fluent风格的TPL ...
- 动态规划----最长递增子序列问题(LIS)
题目: 输出最长递增子序列的长度,如输入 4 2 3 1 5 6,输出 4 (因为 2 3 5 6组成了最长递增子序列). 暴力破解法:这种方法很简单,两层for循环搞定,时间复杂度是O(N2). 动 ...
- Java开发快速上手
Java开发快速上手 前言 1.我的大学 2.对初学者的建议 3.大牛的三大特点 4.与他人的差距 第一章 了解Java开发语言 前言 基础常识 1.1 什么是Java 1.1.1 跨平台性 1.2 ...
- [Swift]LeetCode5. 最长回文子串 | Longest Palindromic Substring
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- [Swift]LeetCode256.粉刷房子 $ Paint House
There are a row of n houses, each house can be painted with one of the three colors: red, blue or gr ...
- [Swift]LeetCode304. 二维区域和检索 - 矩阵不可变 | Range Sum Query 2D - Immutable
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...
- [Swift]LeetCode365. 水壶问题 | Water and Jug Problem
You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...