|
本帖最后由 鲁凯啸 于 2016-12-10 16:46 编辑
1.奇偶判断
不要使用 i % 2 == 1 来判断是否是奇数,因为i为负奇数时不成立,
请使用 i % 2 != 0 来判断是否是奇数,或使用高效式 (i & 1) != 0来判断。
2.小数精度计算
- System.out.println(2.00 - 1.10 ); // 0.8999999999999999
复制代码
解决方案1:
- System.out.println( new BigDecimal("2.0" ) .subtract(new BigDecimal("1.10" )) ); // 0.9
复制代码一定要用BigDecimal(String)构造器,而千万不要用BigDecimal(double)来构造
(也不能将float或double型转换成String再来使用BigDecimal(String) 来构造,
因为在将float或double转换成String时精度已丢失)。
另外,如果要比较两个浮点数的大小,要使用BigDecimal的compareTo方法。
解决方案2:
- System.out.println(200 - 110); // 90
复制代码
3.int整数相乘溢出
- final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000; // 正确结果应为:86400000000 实际结果为500654080
复制代码24 * 60 * 60 * 1000 这个时候是int类型,
当再次乘以1000的时候就会超过int的最大范围-2147483648--2147483647,
因此结果错误
解决方案:
- final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000; // 把int类型转换成Long计算就行了
复制代码
4.三元表达式(?:)- char x = 'X' ; int i = 0 ; <span style="background-color: rgb(255, 255, 255);">System.out.println(true ? x : 0 ); </span><span style="background-color: rgb(255, 255, 255);">System.out.println(false ? i : x);</span>
复制代码如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式的类型。
如果一个操作的类型是T,T表示byte、short或char,而另一个操作数是一个int类型的“字面常量”,并且它的值可以用类型T表示,那条件表达式的类型就是T。否则,将对操作数类型进行提升,而条件表达式的类型就是第二个和第三个操作被提升之后的类型
|
|