1. 程式人生 > 程式設計 >分母為0一定會拋異常嗎?

分母為0一定會拋異常嗎?

現象描述

最近做了一個需求,用到了 預算 / 時間視窗數,其中預算是double型別,時間視窗數是int型別,其中時間視窗數我計算的有問題,會出現為0的情況(實際最小值應該為1),然後就出現了 一個double型別的數除以0的情況,分母為0,是不是要報 java.lang.ArithmeticException: / by zero?(不蠻大家,我最初也是這樣認為的,但這個異常是針對整數的,浮點數運算引入了無限的概念)

結果沒有丟擲異常,而是返回了 Infinity

復現

@Test
public void test() {
    double price = 100d;
    int num = 0;
    System.out.println(price / num); // 輸出結果為 Infinity
}複製程式碼

分析

浮點數引入無限的概念來處理這種分母為0的情況,Infinity主要是為瞭解決除數為0的情況,上面的例子是正的Infinity,其實還有負的Infinity,如下例子所示

@Test
public void test() {
    double price = 100d;
    int num = 0;
    System.out.println(- price / num); // 輸出結果為 -Infinity
}複製程式碼

我們看下double中對Infinity和-Infinity的解釋file

擴充套件

浮點數除了有Infinity,還有NaN,用來表示 0 / 0

@Test
public void test() {
    int num = 0;
    System.out.println(0d / num); // 輸出結果為 NaN
}複製程式碼

我們看下double中對NaN的解釋file

總結

1.浮點數在運算時,如果遇到分母為0的情況,會用一個代表無限的Infinity來表示,而遇到分子和分母都為0的情況,用NaN來表示。

2.異常java.lang.ArithmeticException: / by zero 是針對整數的

3.並不是所有的分母為0都會拋異常

以上同樣適用於float