對於數字,咱們再熟悉不過了。經過let num = 123;
能夠建立一個數字。
javascript
經過Number(thing)
能夠將任何類型的數據轉化成數字。java
經過new Number(thing)
能夠將任何類型的數據轉化成Number
類型的對象。git
數字直接量能直接使用Number
對象上的屬性和方法,如100['toFixed'](1)
。其實語言內部會臨時將100
封裝成對象,再執行相應的方法。能夠當作是Number(100).toFixed(1)
。編程
數字直接量也能用點運算(.
)使用Number
對象上的屬性和方法,可是數字後要加上空格,如100 .toFixed(1)
,由於編譯器不瞭解.
表示小數點仍是運算符,必須加上空格表示.
前面是一個完整的數字。安全
除了常見的數字外,NaN
和Infinity
也屬於Number
類型。除了十進制,JavaScript 還支持二進制(0b111
)、八進制(0o777
,0開頭也能表示八進制,但不推薦)、十六進制(0xfff
)的數字表示方式,還有科學計數法(2.345e+3
)表示方式。dom
這些靜態屬性不多會用到,通常用於檢測是否超過精度。(文章最後說起精度問題)
編程語言
須要單獨說一下,安全整數指的是能作正確運算的整數。在整數相加時,須要將指數位換算成相同的值,如 252+1 = 252+252*2-52 ,而後對分數位加減運算。當超出安全範圍時,如253+1 ,發現 1 沒法轉化成 253*2-53,由於分數位的位數只有 52 位。
函數
(其實計算Number.MAX_SAFE_INTEGER + 1
和Number.MIN_SAFE_INTEGER - 1
是能夠獲得正確的結果)ui
第一個和最後兩個方法比較經常使用。其中Number.isNaN(value)
是比較實用的,由於咱們沒法經過value===NaN
判斷value
是否爲NaN
。
編碼
value
是否爲NaN
。value
是否爲有限數,非數字類型返回false
。value
是否爲整數,非數字類型返回false
。value
是否爲安全整數( -(253 - 1) 至 253 - 1 之間 )。NaN
;其餘狀況請查看文檔。radix
默認爲 10 ,即十進制。傳入非字符串和數字會返回NaN
;其餘狀況請查看文檔。Number
對象的字符串。fractionDigits
默認爲小數點後的將盡量用最多的位數來表示該數值。例子:100 .toExponential(); // "1e+2"
、2.345 .toExponential(2); // "2.35e+0"
。digits
位小數。digits
默認爲 0 。通常用於減小小數點的經度,例如2.345 .toFixed(2); // "2.35"
。precision
表示有效數個數的整數,省略則返回原數值。例子:100 .toPrecision(2); // "1.0e+2"
、2.345 .toPrecision(3); // "2.35"
。Number
對象的字符串表示形式。radix表示轉換的基數(從2到36),默認爲 10 。Number
對象包裝的原始值。與其它全局對象不一樣的是,Math
不是一個構造器。Math
的全部屬性和方法都是靜態的。你用到的常數 pi 能夠用Math.PI
表示,用x
做參數Math.sin(x)
調用 sin 函數。JavaScript 中的常數,是以全精度的實數定義的。
通常用於獲得數學常量。
普通運算:
1
;其餘負數返回-1
;其餘參數返回NaN
。開方:
冪運算:
x**y
。對數運算:
Math.log(x+1)
。三角函數:
求最值:
精度:
關於精度問題,從一個簡單的加法開始。
console.log(0.1 + 0.2); // 0.30000000000000004複製代碼
這是因爲 JavaScript 採用 IEEE 754 標準,因此上述問題並不是 JavaScript 特有,是使用該標準的的編程語言都存在的問題。下面簡單講解問題發生的緣由。(相關專業知識請查閱書本或文檔)
IEEE 754 規定了包括:單精度(32位)、雙精度(64位)、延伸單精度(43比特以上,不多使用)與延伸雙精度(79比特以上,一般以80位實現)。而 JavaScript 使用的是雙精度。
一個浮點數(value)能夠這樣表示:
一個浮點數的存儲方式以下圖:
總共分爲三部分:
+
,1 表示-
。1000 0011
。下面介紹指數位的範圍。若是浮點數中指數部分的編碼值在 0<exponent≤2e-2 之間,且在科學表示法的表示方式下,分數 (fraction) 部分最高有效位(即整數字)是 1 (並不會存儲),那麼這個浮點數將被稱爲規約形式的浮點數。簡單說就是,指數部分用二進制爲000...001
到111...110
之間;分數部分的實際值大於等於 0.5 ,小於 1 。關於換算,下面會說。
若是浮點數的指數部分的編碼值是 0 ,即實際指數值爲 -126 ;分數部分非零,那麼這個浮點數將被稱爲非規約形式的浮點數。 IEEE 754標準規定:非規約形式的浮點數的指數偏移值比規約形式的浮點數的指數偏移值小 1 ,即 2e-1-2 。主要是用於解決填補絕對值意義下最小規格數與零的距離。
(下面用 e 表示指數位的位數)
對於規約形式的浮點數,指數偏移值爲 2e-1-1 。因爲該值不能爲 0 ,因此實際的指數範圍爲 -126 到 127 。
對於非規約形式的浮點數,指數偏移值爲 2e-1-2 ,即比規約形式的浮點數的偏移值要小 1 。因爲該值只能爲 0 ,因此實際的指數值爲 -126 。
總的來講就是,實際的指數值範圍爲 -126 到 127 。000...001
是規約形式的浮點數的指數位的最小值;000...000
是非規約形式的浮點數的指數位的最小值,二者表示的實際指數值都是
-126 。
1.625
爲例。
咱們並不能直接當作1625
轉成二進制。須要使用以下方法(用 f 表示當前十進制數值):
第一步先把數值減 1 獲得新的數值,第一位取 1 。新的數值*2
,若整數部分獲得 1 ,則該位爲 1 ,不然爲 0 ;而後繼續取小數部分同上操做,獲得後面位的值,直到數恰好爲 0 或達到規定位數的最大值(最大精度)。
舉個實際例子,對於1.625
:
1.625
,整數位爲 1 ,則第一位取 1 ,用 0.625 繼續操做;0.625 * 2 = 1.250
,整數位爲 1 ,則第二位取 1 ,用 0.25 繼續操做;0.25* 2 = 0.5
,整數位爲 0 ,則第三位取 0 ,用 0.5 繼續操做;0.5 * 2 = 1.0
,整數位爲 1 ,則第四位取 1 ,小數點後爲 0 ,轉換結束;後面用 0 補全位數便可。
因此,在二進制,第一個有效數字一定是 1 ,所以這個 1 並不會存儲。
(如何從二進制的值獲得十進制?對於上面的例子是: "1101"/23=13/8=1.625 )
對於那些大於 1 或小於 0.5 的浮點數來講,須要格式化後才能看出"三部分"分別的值是多少。(由於要保證二進制的分數位的實際第一位是 1 )簡單說就是要使得 1≤fraction<2 。
以6.625
爲例,須要換算成 1.65625 * 22 。而後咱們用上面的方法,把1.65625
換算成二進制就是110101 00...
。
可是,最高位的 1 並不會存儲,因此獲得的分數位的二進制值爲10101 00...
(尾數用 0 補全)。
指數位爲 3 ,加上偏移值獲得的二進制值爲100...011
(中間都是 0)。
上面演示了 fraction≥2 的狀況,就是乘以 2n(n>0);而 fraction<1 也同樣乘以 2n ,不一樣的是 n<0 。
6.625
爲例:
6
和0.625
。6
的進制轉換比較熟悉,結果是110
。0.625
按照相似於上面的分數位的轉換規則,但忽略第一步,獲得的結果是101
。110.101
。1.xxxx
的形式,即1.10101
,最高位省略,得分數位爲10101
。110.101
的小數點向前左移動了 2 位,則獲得指數位的值爲 2 ,加上指數偏移值獲得100...001
(省略的是0)。0 100...001 101010...
(省略的是 0 )。而對於0.2
這種小於 1 的數,也是相似的作法,區別在於第 6 步,"向左移動"變爲"向右移動",獲得的指數位的值爲負數,即 -3 ,加上指數偏移值獲得的是011...100
(省略的是1)。
因此對於 0.1 和 0.2 來講,根據上main的方法獲得的二進制的值都是11001100...
,都是以1100
不斷重複。
計算機存儲的位數是有限的,必須把超出的位數捨去。因此對於這種,在有限精度內不能徹底表示的,就會形成精度缺失。就是11001100...
從二進制轉換回十進制後總會比原來的值小那麼一點。