Java中关于数学运算应该注意的点
- Java中浮点数除以 0 产生的结果
public static void main(String[] args) {
var i = 15.0;
var x = i/0;
System.out.println(getType(x));
System.out.println(x);
}
private static String getType(Object o) {
return o.getClass().getName();
}
输出结果
java.lang.Double
Infinity
- Java中 int 类型运算结果超出最大值
public static void main(String[] args) {
var i = 1000000000;
System.out.println(3 * i);
}
对于上面这个程序,控制台输出的结果是:-1294967296。结果显然是错误的
数学运算符只是悄悄地返回错误的结果而不做任何提醒。
Java中,当用一个运算符连接两个值时,先要将两个操作数转换为同一类型,然后再进行操作。
如果两个操作数中有一个是double类型,另一个操作数就会被转换为double类型
否则,如果其中一个是float类型,另一个操作数就会被转换为float类型
否则,如果其中一个是long类型,另一个操作数就会被转换为long类型
否则,两个操作数都会被转换为int类型。
要注意,两个byte类型的数相加,其结果是一个int类型,而不是一个byte类型。
- 强制类型转换通过截断小数部分将浮点值转换为整型。
>>
和<<
分别表示右移运算符和左移运算符,>>>
表示无符号右移运算符,
>>>
会用0填充高位,这与>>
不同,它会用符号位填充高位,不存在<<<
操作符。
移位运算符的右操作数要完成模32运算(除非左运算数是long类型,这种情况下右操作数要模64)。例如:1<<35等同于1<<3
-
同一个级别的运算符按照从左向右的次序进行计算(右结合运算符除外)
参考资料:
[1] Cay S.Horstmann 著,林琪 苏钰涵等译.Java核心技术 卷1(原书第11版).北京:机械工业出版社,2020:37-44.
[2] 百度百科.移位运算符.https://baike.baidu.com/item/移位运算符