第 1 天的問題
下面的方法意圖確定它那唯一的參數是否是一個奇數。這個方法能夠正確運轉嗎?
public static boolean odd(int number) {
return number % 2 == 1;
}
第 1 天問題的解答
有1/4的情況下,答案是錯誤的。比如:odd(-3) 表達式得到的結果就是 fasle。對于所有的負奇數,上面的方法都會得到錯誤的結果。
原因
問題的原因在于求余操作符(%),在Java中該操作符被定義為
對于所有的 int 數值 a 和所有的非零 int 數值 b,都滿足下面的恒等式
(a / b) * b + (a % b) == a
換句話說,(a % b) = a - (a / b) * b
由數學推理運算可知,a % b 的符號有操作數a決定(要么為0,要么和a一致)。也就是說, -5 % 3 => -2, -5 % -3 => -2。
因此,對于所有的負奇數n, n % 2 => -1。問題中的方法自然有問題啦。
解決辦法
要判斷一個整數是否為奇數的解決辦法有兩種。
public static boolean odd(int number) {
return number % 2 != 0;
}
/**
* 這種方法的性能更好。
*/
public static boolean odd(int number) {
return (number & 1) != 0;
}
總結
無論你何時使用到了取余操作符,都要考慮到操作數和結果的符號。
該操作符的行為在其操作數非負時是一目了然的,但是當一個或兩個操作數都是負數時,它的行為就不那么顯而易見了。
今天的問題
請考慮下面這段話所描述的問題:
小明在超市購買了一個價值¥1.10的東西,但是他錢包中只有兩元一張的鈔票。如果他用一張兩元的鈔票支付,那么應該找給他多少零錢呢?
下面是一個試圖解決上述問題的程序,它會打印出什么呢?
public class Change{
public static void main(String args[]){
System.out.println(2.00 - 1.10);
}
}