摘要: 前面的加减乘除四则运算,计算结果通过等号输出给指定变量,注意此时代码把变量放到等号左边。而在算术课本里,加法运算的完整写法类似于“1+1=2”这样,运算结果应该跟在等号右边。不过代数课本里的方程式存在“x=y+1”的写法,表示等号两边的结果数值是一样的,因此变量放在等号左边也是可以理解的。然而Java编程里的“=”并非数学上的相等涵义,而是一种赋值操作,所谓“赋值”,指的是将某一数值赋给某个变量的过程。计算机程序在运行的时候,不管操作什么类型的数据,都要有处地方保存运算前后的数值。变量在参与计算的时候,它可能存在多种身份,当变量作为运算过程的操作数之时,它保存的是运算前的数值;当变量作为运算结果的输出数之时,它保存的是运算后的数值。故而等号两边同时出现某个变量是完全正常的,就像下面代码演示的那样:注意上述演示代码里的“x = x+7”,等号的左右两边虽然都出现了整型变量x,但是这两个x所处的时间点不同,使得它们代表的数值也不一样。等号右边的x,保存的是运算开始前的变量值,即2;而等号左边的x,保存的是运算结束后的数值,即9。所以前面的代码看似代数方程式,其实表示的是一个存在时间先后概念的赋值语句。 就赋值语句“x = x+7”而言,尽管它从数学角度来看很是无理,可是在计算机编程中却十分常见。该语句仅仅要求给某个整型变量加上若干数值,并未涉及到其它别的什么变量,好比某人的背包里原本装了三本书,然后往里面塞两本书,最终背包一共装了五本书。由于这种加法运算只对某个变量进行,因此Java又提供了“+=”运算符来简化变量的自增操作,新运算符的使用代码示例如下:既然有“+=”开了个自增运算的头,那么其它的四则运算依此类推,均可分别演变出自减运算符“-=”、自乘运算符“*=”、自除运算符“/=”,以及对变量自身取余数的运算符“%=”,相应的例子代码如下所示:推而广之,凡是对变量自身进行某种基础运算,然后运算结果又保存在该变量中,这些情况都适用于扩展了的赋值语句。譬如之前提到的按位左移操作符<<、按位右移操作符>>,均可演化出对应的自身左移运算符“<<=”,以及自身右移运算符“>>=”,这两个运算符的演示代码如下:阅读全文
摘要: 计算机科学起源于数学,早期的计算机也确实多用于数学运算,以至于后来的各路编程语言,仍然保留着古老的加减乘除四则运算。这四则运算在Java语言中有专门的运算符加以表示,像加法符号“+”对应Java的“+”,减法符号“-”对应Java的“-”,乘法符号“×”对应Java的“*”,除法符号“÷”对应Java的“/”,除此之外,还有一个求余数运算,在数学上使用mod表示,而Java对应的求余运算符为“%”。四则运算加求余数运算构成了Java编程的基础算术,数字和运算符的书写顺序与大众写法并无差异,下面便是这几种基本运算的代码例子:运行以上测试代码,得到如下的运算日志。可见上述的运算结果符合平常的加减乘除逻辑。 整数的四则运算看来是波澜不惊,倘若有小数参与运算,计算结果还是一样的吗?接下来先看个除法运算,前面的除法算的是81除以9,因为刚好能除尽,所以求得的商毫无疑义是9。那末换种除不尽的情况,比如说25除以4,按日常生活中的除法,此时求得的商应该是6.25。但是Java语言另有规定,如果被除数和除数都是整型,求得的商也只能是整型数,故而25除以4得到的商变成了6,也就是省略了小数部分。要想让这个商成为包括小数部分的数值,就必须让被除数和除数之一变成小数,只有其中一个是小数,Java才会把整数的除法运算转为小数的除法运算。例如25.0/4、25/4.0、25.0/4.0这几种写法,都将变成双精度类型的除法,最后求得的商也变作了双精度数6.25。下面是前述的除法运算用到的实验代码:运行上面的实验代码,打印出来的运算日志见下。然而对小数进行除法运算,有时候计算结果并不精确,譬如以下的测试代码:这个测试代码的运算很简单,8.1除以3正常求得的商为2.7,至于5.1除以2的余数正常应为1.1。可是一旦运行上述的测试代码,会发现除法结果竟然是下面这样的:以上得到的商和余数真是叫人目瞪口呆,说好的2.7和1.1怎么走样了呢?其实这种情况在一开始便埋下伏笔了,之前介绍浮点型和双精度型时,提到它们本身并非精准的数值,而是一个尾数乘以10的若干次方,并且浮点型的精度只有6到7位,双精度型的精度则为15-16位,精度以外的数字纯属打酱油的。现在Java对小数进行除法运算,打酱油部分的数字也来凑热闹,本来能除得尽的小数,由于些许的偏差反而变得除不尽了,以至造成画蛇添足的尴尬。这就告诉我们,要谨慎对待小数的除法和取余数运算。 阅读全文
摘要: 之前的文章提到,Java语言不但支持大众熟知的十进制数,也支持计算机特有的二进制数、八进制数和十六进制数。可是在给数值变量赋值的时候,等号右边的数字明显属于十进制,那究竟要如何书写其它进制的数字呢?为此Java规定了几种数字前缀,以这些前缀开头的数字就表示特定进制的数值,二进制、八进制和十六进制及其对应的前缀说明如下: 1、二进制,该进制的数值以0b或者0B开头,其后的数字只能是0和1。注意b是binary(二进制)的首字母。 2、八进制,该进制的数值以0开头,其后的数字只能是0到7。 3、十六进制,该进制的数值以0x或者0X开头,其后的数字除了0到9之外,还包括字母a到f(不区分大小写)。注意x代表hexadecimal(十六进制)。 下面是声明各种进制变量的代码例子,依次演示了二进制数、八进制数、十六进制数和十进制数的赋值操作:运行上述代码,在Console窗口的观察结果如下图所示。可见二进制的0b11转成十进制数为3,八进制的011转成十进数为8,十六进制的0x11转成十进数为17,十六进制的0xff转成十进数为255。 由于int类型最大只能表示21亿4千多万的整数,因此再大的整数就要使用long长整型变量了。例如截止2018年元旦,世界总人口达到74亿4444万3881,使用long变量保存世界人口的话,赋值代码本应如下所示:谁料Eclipse居然报错,提示“The literal 7444443881 of type int is out of ”,意思是该数字超出了int类型的表示范围。原来Java里面的整数默认是整型,只分配四个字节的临时空间,然而7444443881超出了整型数的范围,致使默认的存储空间不够用了。要想扩大临时的存储空间,得在数字后面补上l或者L,表示该整数要求分配八个字节的长整型临时空间,这样才供得起7444443881这个大神。于是修改后的长整型赋值代码如下所示:注意上面代码末尾的L只表示数据类型,变量值并不包括“L”这个字母,运行测试代码可见日志打印结果为“worldPopulation=7444443881”。 刚提到Java的整数默认是整型,相对应的,Java的小数默认是双精度型,那么试试下面的代码能否将小数赋值给float变量?果然Eclipse也提示出错了,正确的写法要在小数末尾补上f或者F,表示该小数按照浮点数型分配存储空间。改写后的浮点数赋值代码如下所示:其实小数后面也可以补上d或者D,表示该小数按照双精度型分配存储空间,只是因为Java的小数默认就是double类型,所以小数后面的D可加可不加,不影响正常的编译。 这下几种数字类型都能够正确地赋值了,但是还有个细节问题,当数字的位数很多的时候,后面有多少个零会让初学者看得眼花缭乱。现实生活中,整数通常每隔四位就在中间补上空格或者补上逗号,譬如说中国的领土面积是960万平方公里,实际书写一般为“960 0000”或者“960,0000”,这样可以很清楚地区分万的单位乃至亿的单位。在Java编程中,从Java7开始,允许在数字中间插入下划线作为分隔符,下划线本身没有保存到变量中,它的作用类似前面的空格和逗号,仅仅是方便程序员数清具体的位数罢了。下面是在数字变量赋值时添加下划线的代码例子:虽然下划线方便了程序员数数,数字的长度却变得更长了,倘若再来一个更大的整数,例如太阳到地球的距离为1.5亿公里,展开可是150000000千米,Java赋值加了下划线则为“1_5000_0000”,此时后面拖了许多个零。在数学上,可以通过科学记数法表示这种较大的数,也就是把一个数书写成a与10的n次幂相乘的形式。Java代码也有与科学记数法类似的表达方式,像1.5亿这个数字,其实等于1.5乘以10的8次方,在代码中可以通过“E8”或者“e8”表示10的8次方,于是采取科学记数法的Java赋值代码举例如下:上述代码中的1.5是小数,所以必须使用双精度数作为赋值变量,而不能用整形或长整型数。即使E前面的数字是整数,该变量也只能是双精度类型,因为Java约定了科学记数法专用于双精度数字。阅读全文

©2018 axeplan | Email:axe@axeplan.com

京公网安备 11010502036700号

| 京ICP备18050435号-1