ITEEDU

入门准备

接触对象

对象导向

资源管理

对象容器(Container)

输入输出(I/O)

执行绪(Thread)

反射(Reflection)

metadata

数据库(JDBC)

舍遗补缺

Java Gossip: 算术运算

程序的目的简单的说就是运算、运算还是运算,加减乘除这类的动作是少不得的,在Java中提供运算功能的就是运算子(Operator),例如与算术相关的加(+)、减(-)、乘(*)、 除(/)这类的运算子,另外还有一个也很常用的余除运算子(%),这类以数学运算为主的运算子,称之为「算术运算子」(Arithmetic operator)。

这类运算子的使用基本上与我们学过的加减乘除一样,也是先乘除后加减,必要时加上括号表示运算的先后顺序,例如这个程序代码会在主控台显示7:

System.out.println(1 + 2 * 3);

编译器在读取程序代码时,是由左往右读取的,而初学者往往会犯一个错误,例如(1+2+3) / 4,由于一般习惯将分子写在上面,而分母写在下面的方式,使得初学者往往将之写成了:

System.out.println(1+2+3 / 4);

这个程序事实上会是这样运算的:1+2+(3/4);为了避免这样的错误,在必要的时候为表达式加上括号才是最保险的,例如:

System.out.println((double)(1+2+3) / 4);

注意在上面的程序代码中使用了double限定型态转换,如果不加上这 个限定字的话,程序的输出会是1而不是1.5,这是因 为在这个Java程序中,1、2、3、4这四个数值都是整数,当程序运算后,会自动去除小数点之后的数字再进行输出,而加上double限定,表示 要运算后的值转换为double数据型态,如此小数点之后的数字才不会被去除。

同样的,看看这段程序会印出什么结果?

int testNumber = 10; 
System.out.println(testNumber/ 3); 

答案不是3.3333,而是3,小数点之后的部份被自动消去了,这是因为estNumber是整数,而除数3也是整数,运算出来的程序被自动转换为整数 了,为了解决这个问题,您可以使用下面的方法:

int testNumber = 10; 
System.out.println(testNumber/ 3.0); 
System.out.println((double)testNumber / 3);

上面这个程序片段示范了两种解决方式:如果表达式中有一个浮点数,则程序就会先转换使用浮点数来运算,这是第一段程序所使用的方式;第二个方式称之为「限 定型态转换」,您使用double告诉程序先将testNumber的值转换为double,然后再进行除法运算,所以结果会是正确的3.3333;型态 转换的限定关键词就是宣告变量时所使用的int、float等关键词。

当您将精确度小的数据型态(例如int)指定给精确度大的数据型态(例如double),这样的指定在精确度并不会失去,所以这样的指定是可行的。

Java对于程序的安全性要求极高,型态转换在某些情况一定要明确指定,就是在使用指定运算子时,将精确度大的指定给精确度小的变量时,由于在精确度上会 有遗失的现象,编译器会认定这是一个错误,例如:

int testInteger = 0; 
double testDouble = 3.14; 
testInteger = testDouble; 
System.out.println(testInteger); 

这段程序在编译时会出现以下的错误讯息:

possible loss of precision 
found?: double 
required: int 
testInteger = testDouble
^ 
1 error 

如果您确定这是您要的结果,您必须明确加上转换的限定字:

testInteger = (int) testDouble;

%运算子是余除运算子,它计算除法后的余数,一个使用的例子是数字循 环,假设有一个立方体要进行360度旋转,每次在角度上加1,而360度后必须复归为0,然后重新计数,这时您可以这么撰写:

count = (count + 1) % 360;