Google Prettify

2014-11-18

進行Java 除法運算時,不提醒你很容易埋的bug

Java的除法,有一些很基礎的操作,這些操作平常不會發生問題,但一旦發生真的是因為這些操作導致的bug,也真的是很難查覺得出來。

小學數學規定:「除數不能為零」 XD,原來事情不像小學生想得這麼簡單。



「除數不能為零」不是只是『規定』,他其實是有不得以的原因

Wiki 有一堆不是專業數學碩士看不懂的證明,說明它不只是「不能為零」,而且是「必需『不』為零」,不然1會等於2…。

不過不管除數可不可以為零,在Java裡,其實是可以的…。

public class FloatOperation {
    private static Logger logger = LoggerFactory.getLogger(FloatOperation.class);

    public static void main(String[] args) {
        div("案例1", 6, 4);
        div("案例2", 2, 3.0);
        div("案例3", 2.3, 0.0);
        div("案例4", 2.3, -0.0);
        div("案例5", 0.0, 0.0);
        div("案例6", 0.0, -0.0);
        div("案例7", 0.0, 0.1);
        div("案例8", 0.0, -0.1);
    }

    public static Double div(String title, int a, int b) {
        double x = a / b;
        logger.trace("{}: {}/{}={}", title, a, b, x);
        return x;
    }

    public static Double div(String title, double a, double b) {
        double x = a / b;
        logger.trace("{}: {}/{}={}", title, a, b, x);
        return x;
    }

以上範例程式執行結果如下:

278 [TRACE] t.b.b.FloatOperation[22]: 案例1: 6/4=1.0
281 [TRACE] t.b.b.FloatOperation[28]: 案例2: 2.0/3.0=0.6666666666666666
281 [TRACE] t.b.b.FloatOperation[28]: 案例3: 2.3/0.0=Infinity
282 [TRACE] t.b.b.FloatOperation[28]: 案例4: 2.3/-0.0=-Infinity
282 [TRACE] t.b.b.FloatOperation[28]: 案例5: 0.0/0.0=NaN
282 [TRACE] t.b.b.FloatOperation[28]: 案例6: 0.0/-0.0=NaN
282 [TRACE] t.b.b.FloatOperation[28]: 案例7: 0.0/0.1=0.0
282 [TRACE] t.b.b.FloatOperation[28]: 案例8: 0.0/-0.1=-0.0

簡單來說, 做幾個結論:

  • 除數為「整數」0 時會丟異常。
  • 除法的時候,除數、被除數任一為浮點數,結果即為浮點數。 若都是整數,則結果為整數,就如同浮點數轉型為整數一樣,小數點後的東西都被刪光了。案例1即為例子。
  • 0.0做除數而被除數不為0時,得到的是一個分正負的無窮大(Infinity),看是+0f或是-0f。
  • 當兩個數的絕對值均爲0.0時候,商等于NaN。
  • 如一般所認知的,0.0/任何不為0的數,都為0。而且這是有帶正負符號位的;符號位由被除數決定。當然,如果負負的話,還是會得正。

DoubleFloat都有提供static 與非static 的inFinite與NaN的判斷API,在使用除法運算時,要使用這些API來進行安全判斷.

Double、Float類中都提供了一些常數,可以用這些常數來判斷正無限大或負無限大。

public static final double POSITIVE_INFINITY = 1.0 / 0.0; 
public static final double NEGATIVE_INFINITY = -1.0 / 0.0; 
public static final double NaN = 0.0d / 0.0; 

沒有留言 :

您或許對這些有興趣

Related Posts with Thumbnails

最後

謝謝您的閱讀,希望您可以有豐富的收獲。