分母爲0必定會拋異常嗎?

現象描述

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

結果沒有拋出異常,而是返回了 Infinityspa

復現

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

分析

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

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

咱們看下double中對Infinity和-Infinity的解釋filecode

擴展

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

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

咱們看下double中對NaN的解釋blog

file

總結

1.浮點數在運算時,若是遇到分母爲0的狀況,會用一個表明無限的Infinity來表示,而遇到分子和分母都爲0的狀況,用NaN來表示。it

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

3.並非全部的分母爲0都會拋異常class

以上一樣適用於floattest

相關文章
相關標籤/搜索