分母為0一定會拋異常嗎?
阿新 • • 發佈:2019-12-31
現象描述
最近做了一個需求,用到了 預算 / 時間視窗數,其中預算是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的解釋
擴充套件
浮點數除了有Infinity,還有NaN,用來表示 0 / 0
@Test
public void test() {
int num = 0;
System.out.println(0d / num); // 輸出結果為 NaN
}複製程式碼
我們看下double中對NaN的解釋
總結
1.浮點數在運算時,如果遇到分母為0的情況,會用一個代表無限的Infinity來表示,而遇到分子和分母都為0的情況,用NaN來表示。
2.異常java.lang.ArithmeticException: / by zero 是針對整數的
3.並不是所有的分母為0都會拋異常
以上同樣適用於float