解惑1:奇偶性
奇偶性判断可用&运算代替取余运算:
偶数:(i & 1) == 0;
奇数:(i & 1) != 0;
解惑2:找零时刻
System.out.println(2.0 - 1.1); //输出0.8999999999999999
二进制浮点不适合货币计算,它不能将0.1或10的其他任何负次幂精确表示为一个有限长度的二进制小数,只能表示为最靠近它的临近值。1.1不能被精确表示为一个double,因此2.0减去1.1的临近值就得到输出结果。
解决方法可以将小数化为相应的整数进行计算,或者使用Java在java.math包中提供的API类BigDecimal,且必须使用参数类型为String的构造函数,上述代码可表示为:
System.out.println(new BigDecimal("2.0").subtract(new BigDecimal("1.1"))); //输出0.9
解惑3:长整数
long a = 24 * 60 * 60 * 1000 * 1000; long b = 24L * 60 * 60 * 1000 * 1000; System.out.println(a); //输出500654080 System.out.println(b); //输出86400000000 System.out.println(Integer.MAX_VALUE); //输出2147483647
System.out.println(Long.MAX_VALUE); //输出9223372036854775807
当操作数字很大时,要提防溢出。如上述代码,a虽然是long类型,但其赋值号右边的运算均以int运算来执行,在运算完成之后才提升为long型,而计算过程中已溢出(整型最大值为2^31-1 = 2147483647)。而b的第一个因子为long型,可使得每一个乘积的第一个因子均为long型,因此可以强制表达式所有后续计算都用long运算,且计算结果不会溢出(长整型最大值为2^63-1 = 9223372036854775807)。
解惑4:初级问题
注意区分 54321 和 5432l 。后者为long型值为5432,为了区分,在long类型字面值常量中,建议用大写的L表示。