1、找奇數(shù):
public static boolean isOdd(int i){
return i % 2 == 1;
}
上面的方法真的能找到所有的奇數(shù)么?
A:沒有考慮到負數(shù)問題,如果i為負則不正確。應該return i%2 == 0
2. 浮點數(shù)相減
System.out.println(2.0-1.9);
A:Java中的簡單浮點數(shù)類型float和double不能夠進行運算。不光是Java,在其它很多編程語言中也有這樣的問題。在大多數(shù)情況下,計算的結果是準確的,但是多試幾次(可以做一個循環(huán))就可以試出類似上面的錯誤。當然加減乘除都有可能有問題,比如:
System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);
這是因為有些十進制有限位數(shù)的小數(shù),到二進制里面可能會變成無限循環(huán)小數(shù),在浮點數(shù)中不能表示而損傷精度。
解決方法:
2.1. 如果是判斷a-b是否等于c,或者a+b是否等于c的,可以使用
if(0.05+0.01-0.06 < 0.0000001)
{
}
2.2. 在《Effective Java》這本書中提到一個原則,float和double只能用來做科學計算或者是工程計算,在商業(yè)計算中我們要用 java.math.BigDecimal來解決
System.out.println((new BigDecimal("2.0")).subtract(new BigDecimal("1.9")).doubleValue());
3. 無限循環(huán)
public static final int END = Integer.MAX_VALUE;
public static final int START = END - 2;
public static void main(String[] args) {
int count = 0;
for (int i = START; i <= END; i++)
count++;
System.out.println(count);
}
A:這里無限循環(huán)的原因就是當i為Integer.MAX_VALUE時,此時for循環(huán)是先++,然后判斷i是否<=END,當i為Integer.MAX_VALUE再++時,i變成了負數(shù)。所以就一直循環(huán)下去。
變成負數(shù)的原因就是int溢出了。這里將<=END改成<END就可以解決問題。
4. 到底返回什么?
public static boolean decision() {
try {
return true;
} finally {
return false;
}
}
A:返回false。此時return true是不可達語句,在編譯階段將優(yōu)化去掉。