JavaScript 中的 Number類型

JavaScript? 中最基本的數(shù)值字面量格式是十進制整數(shù),直接寫出來即可:
整數(shù)也可以用八進制(以8為基數(shù))或十六進制(以16為基數(shù))字面量表示。
對于八進制字面量,第一個數(shù)字必須是零(0),然后是相應的八進制數(shù)字(數(shù)值0~7)。
如果字面量中包含的數(shù)字超出了應有的范圍,就會忽略前綴的零,后面的數(shù)字序列會被當成十進制數(shù),如下所示:
要創(chuàng)建十六進制字面量,必須讓真正的數(shù)值前綴0x(區(qū)分大小寫),然后是十六進制數(shù)字(0~9以及A~F)。十六進制數(shù)字中的字母大小寫均可。下面是幾個例子:
浮點值,數(shù)值中必須包含小數(shù)點,而且小數(shù)點后面必須至少有一個數(shù)字。雖然小數(shù)點前面不是必須有整數(shù),但推薦加上。下面是幾個例子:
因為存儲浮點值使用的內(nèi)存空間是存儲整數(shù)值的兩倍,所以ECMAScript總是想方設法把值轉(zhuǎn)換為整數(shù)。在小數(shù)點后面沒有數(shù)字的情況下,數(shù)值就會變成整數(shù)。
類似地,如果數(shù)值本身就是整數(shù),只是小數(shù)點后面跟著0(如1.0),那它也會被轉(zhuǎn)換為整數(shù),如下例所示:
對于非常大或非常小的數(shù)值,浮點值可以用科學記數(shù)法來表示:
科學記數(shù)法也可以用于表示非常小的數(shù)值,例如0.00000000000000003。這個數(shù)值用科學記數(shù)法可以表示為3e-17。默認情況下,ECMAScript會將小數(shù)點后至少包含6個零的浮點值轉(zhuǎn)換為科學記數(shù)法(例如,0.000000 3會被轉(zhuǎn)換為3e-7)。
浮點值的精確度最高可達17位小數(shù),但在算術計算中遠不如整數(shù)精確。例如,0.1加0.2得到的不是0.3,而是0.30000000000000004。由于這種微小的舍入錯誤,導致很難測試特定的浮點值。比如下面的例子:
這里檢測兩個數(shù)值之和是否等于0.3。如果兩個數(shù)值分別是0.05和0.25,或者0.15和0.15,那沒問題。但如果是0.1和0.2,如前所述,測試將失敗。因此永遠不要測試某個特定的浮點值。
由于內(nèi)存的限制,ECMAScript并不支持表示這個世界上的所有數(shù)值。
ECMAScript可以表示的最小數(shù)值保存在Number.MIN_VALUE中,這個值在多數(shù)瀏覽器中是5e-324;可以表示的最大數(shù)值保存在Number.MAX_VALUE中,這個值在多數(shù)瀏覽器中是1.797693134862315 7e+308。
如果某個計算得到的數(shù)值結果超出了JavaScript可以表示的范圍,那么這個數(shù)值會被自動轉(zhuǎn)換為一個特殊的Infinity(無窮)值。任何無法表示的負數(shù)以-Infinity(負無窮大)表示,任何無法表示的正數(shù)以Infinity(正無窮大)表示。
如果計算返回正Infinity或負Infinity,則該值將不能再進一步用于任何計算。這是因為Infinity沒有可用于計算的數(shù)值表示形式。要確定一個值是不是有限大(即介于JavaScript能表示的最小值和最大值之間),可以使用isFinite()函數(shù),如下所示:
有一個特殊的數(shù)值叫NaN,意思是“不是數(shù)值”(Not a Number),用于表示本來要返回數(shù)值的操作失敗了(而不是拋出錯誤)。比如,用0除任意數(shù)值在其他語言中通常都會導致錯誤,從而中止代碼執(zhí)行。但在ECMAScript中,0、+0或-0相除會返回NaN:
如果分子是非0值,分母是有符號0或無符號0,則會返回Infinity或-Infinity:
NaN有幾個獨特的屬性。首先,任何涉及NaN的操作始終返回NaN(如NaN/10),在連續(xù)多步計算時這可能是個問題。其次,NaN不等于包括NaN在內(nèi)的任何值。例如,下面的比較操作會返回false:
為此,ECMAScript提供了isNaN()函數(shù)。該函數(shù)接收一個參數(shù),可以是任意數(shù)據(jù)類型,然后判斷這個參數(shù)是否“不是數(shù)值”。把一個值傳給isNaN()后,該函數(shù)會嘗試把它轉(zhuǎn)換為數(shù)值。某些非數(shù)值的值可以直接轉(zhuǎn)換成數(shù)值,如字符串"10"或布爾值。任何不能轉(zhuǎn)換為數(shù)值的值都會導致這個函數(shù)返回true。舉例如下: