1. 程式人生 > >Java求兩個數平均值

Java求兩個數平均值

int param 練習 深入 發現 通用 個數 範圍 相加

  如何正確的求2個數的平均值。在練習算法二分查找的時候發現的,以前沒有註意到的bug

  備註:數據以int類型為例

一、以前的通用寫法

1 /**
2      * 求a+b平均值
3      * @param a
4      * @param b
5      * @return a+b的平均值
6      */
7     static int avg(int a ,int b){
8         return (a+b)/2;
9     }

  請記住:這是一個有bug的寫法,因為兩個數相加有可能超過了int的範圍,但是他們的平均值肯定不會超過範圍。以前沒有註意到這個問題,知道深入了解了位運算。

二、正確寫法

 1 /**
 2      * 求a+b平均值
 3      * @param a
 4      * @param b
 5      * @return a+b的平均值
 6      */
 7     static int avg(int a ,int b){
 8         double random = Math.random();
 9         if (random >= 0 && random <= 0.25){
10             //正確寫法1
11             return ((a&b) + ((a^b) >> 1));
12 }else if (random > 0.25 && random <= 0.5){ 13 //正確寫法2 14 return b+(a-b)/2; 15 }else if (random > 0.5 && random <= 0.75){ 16 //正確寫法3 17 return b+((a-b)>>1); 18 }else if (random > 0.75 && random <= 1.0){
19 //正確寫法4 20 return (a+b)>>>1; 21 }else { 22 return -1; 23 } 24 }

Java求兩個數平均值