数值转换
在Java中,我们经常需要将一种数值类型转换为另一种数值类型。
例如:
int n=123456789;
float f=n;
当将这个整数数值转换为float时,将会得到同样大小的结果,但却失去了一定的精度。
当使用上面两个数值进行二元操作时(例如n+f,n是整数,f是浮点数),先将这两个操作数转换为同一种类型,然后再计算。
- 如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型。
- 否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型。
- 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型。
- 否则,两个操作数都将会转换为int类型。
从上看来,在必要的时候,int类型的值自动地转换为double。但是,有时也需要将double转换为int。所以,我们就会用到强制类型转换。
例如:
double x=9.997;
int nx=(int)x;
这样变量nx的值就变成9了。
如果,想对数据进行四舍五入处理,我们需要用Math.round方法:
double x=9.997;
int nx=(int)Math.round(x);
需要注意的是,将一个数值从一种类型强制转换为另一种类型时,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如,(byte)300的实际值为44。
在赋值的时候,我们可以使用二元运算符。
例如:
x+=4;
等价于:
x=x+4;
这样做的好处是,如果运算符得到的是一个值,其类型与左侧操作数的类型不同,就会发生强制类型转换。
其他运算符
- 自增与自减运算符
int m=7;
int m=7;
int a=x* ++m;//now a is 16,m is 8;
int a=x* n++;//now a is 14,m is 8;
上面介绍的是运算符放在操作数后面的“后缀”形式和“前缀”形式,它们都会使变量值加1或减1。但,用在表达式中时,二者就有区别了。前缀形式会先完成加1,而“后缀”形式会使用变量原来的值。
建议不要在表达式中使用++,因为这样的代码很容易让人困惑,而且会带来烦人的bug。
- 关系和boolean运算符
运算符 | 含义 |
---|---|
== | 检测相等性 |
!= | 检测不相等 |
&& | 逻辑‘’与‘’ |
& | 与 |
&& | 逻辑‘’或‘’ |
l | 或 |
表达式1 ?表达式2:表达式3 | 当表达式1的值为true时,执行表达式2,否则,执行表达式2 |
&&和ll运算符是按照“短路”方式来求值的:如果第一个操作数已经能够确定表达式的值,那么,第二个操作数就不必计算了。
- 枚举类型
有时候,变量的取值只在一个有限的集合内。枚举类型包括有限个命名的值。例如:
enum Size{SMALL,MEDIUM,LARGE,QWE};
Size s=Size.MEDIUM;
Size类型的变量只能存储这个类型声明中给定的某个枚举值,或者null值,null表示这个变量没有设置任何值。