數據類型 數字類型



數據類型 數字類型
數字(number)有兩種類型:
JavaScript 中的常規數字以 64 位的格式 IEEE-754 存儲,也被稱為“雙精度浮點數”。
BigInt 數字,用於表示任意長度的整數。有時會需要它們,因為常規數字不能超過 253 或小於 -253。

編寫數字的更多方法
想象一下,我們需要寫 10 億。顯然的方法是:

let billion = 1000000000;
我們通常會將 10 億寫成 "1bn",或將 73 億寫成 "7.3bn"。

在 JavaScript 中,我們通過在數字后附加字母 “e”,並指定零的數量來縮短數字:

let billion = 1e9; // 10 億,字面意思:數字 1 后面跟 9 個 0

alert( 7.3e9 ); // 73 億(7,300,000,000)

十六進制,二進制和八進制數字
十六進制 數字在 JavaScript 中被廣泛用於表示顏色,編碼字符以及其他許多東西。所以自然地,有一種較短的寫方法:0x,然后是數字。

例如:

alert( 0xff ); // 255
alert( 0xFF ); // 255(一樣,大小寫沒影響)

二進制和八進制數字系統很少使用,但也支持使用 0b 和 0o 前綴:

let a = 0b11111111; // 二進制形式的 255
let b = 0o377; // 八進制形式的 255

alert( a == b ); // true,兩邊是相同的數字,都是 255
只有這三種進制支持這種寫法。對於其他進制,我們應該使用函數 parseInt(我們將在本章后面看到)。

toString(base)
方法 num.toString(base) 返回在給定 base 進制數字系統中 num 的字符串表示形式。

舉個例子:

let num = 255;

alert( num.toString(16) ); // ff
alert( num.toString(2) ); // 11111111
base 的范圍可以從 2 到 36。默認情況下是 10。

常見的用例如下:

base=16 用於十六進制顏色,字符編碼等,數字可以是 0..9 或 A..F。

base=2 主要用於調試按位操作,數字可以是 0 或 1。

base=36 是最大進制,數字可以是 0..9 或 A..Z。所有拉丁字母都被用於了表示數字。

對於 36 進制來說,一個有趣且有用的例子是,當我們需要將一個較長的數字標識符轉換成較短的時候,例如做一個短的 URL。可以簡單地使用基數為 36 的數字系統表示:

alert( 123456..toString(36) ); // 2n9c

使用兩個點來調用一個方法
請注意 123456..toString(36) 中的兩個點不是打錯了。如果我們想直接在一個數字上調用一個方法,比如上面例子中的 toString,那么我們需要在它后面放置兩個點 ..。

舍入
舍入(rounding)是使用數字時最常用的操作之一。

這里有幾個對數字進行舍入的內建函數:

Math.floor
向下舍入:3.1 變成 3,-1.1 變成 -2。
Math.ceil
向上舍入:3.1 變成 4,-1.1 變成 -1。
Math.round
向最近的整數舍入:3.1 變成 3,3.6 變成 4,-1.1 變成 -1。
Math.trunc(IE 瀏覽器不支持這個方法)
移除小數點后的所有內容而沒有舍入:3.1 變成 3,-1.1 變成 -1。
這個是總結它們之間差異的表格:

Math.floor Math.ceil Math.round Math.trunc
3.1 3 4 3 3
3.6 3 4 4 3
-1.1 -2 -1 -1 -1
-1.6 -2 -1 -2 -1
這些函數涵蓋了處理數字小數部分的所有可能方法。但是,如果我們想將數字舍入到小數點后 n 位,該怎么辦?

例如,我們有 1.2345,並且想把它舍入到小數點后兩位,僅得到 1.23。

有兩種方式可以實現這個需求:

乘除法

例如,要將數字舍入到小數點后兩位,我們可以將數字乘以 100(或更大的 10 的整數次冪),調用舍入函數,然后再將其除回。

let num = 1.23456;

alert( Math.floor(num * 100) / 100 ); // 1.23456 -> 123.456 -> 123 -> 1.23
函數 toFixed(n) 將數字舍入到小數點后 n 位,並以字符串形式返回結果。

let num = 12.34;
alert( num.toFixed(1) ); // "12.3"
這會向上或向下舍入到最接近的值,類似於 Math.round:

let num = 12.36;
alert( num.toFixed(1) ); // "12.4"
請注意 toFixed 的結果是一個字符串。如果小數部分比所需要的短,則在結尾添加零:

let num = 12.34;
alert( num.toFixed(5) ); // "12.34000",在結尾添加了 0,以達到小數點后五位
我們可以使用一元加號或 Number() 調用,將其轉換為數字:+ num.toFixed(5)。

不精確的計算
考慮下這個(falsy!)測試:

alert( 0.1 + 0.2 == 0.3 ); // false

我們能解決這個問題嗎?當然,最可靠的方法是借助方法 toFixed(n) 對結果進行舍入:

let sum = 0.1 + 0.2;
alert( sum.toFixed(2) ); // 0.30

請注意,toFixed 總是返回一個字符串。它確保小數點后有 2 位數字。如果我們有一個電子購物網站,並需要顯示 ¥ 0.30,這實際上很方便。對於其他情況,我們可以使用一元加號將其強制轉換為一個數字:

let sum = 0.1 + 0.2;
alert( +sum.toFixed(2) ); // 0.3

測試:isFinite 和 isNaN

isNaN() 函數用於檢查其參數是否是非數字值。

如果參數值為 NaN 或字符串、對象、undefined等非數字值則返回 true, 否則返回 false。

alert( isNaN(NaN) ); // true
alert( isNaN("str") ); // true

isFinite(value) 將其參數轉換為數字,如果是常規數字,則返回 true,而不是 NaN/Infinity/-Infinity:

alert( isFinite("15") ); // true
alert( isFinite("str") ); // false,因為是一個特殊的值:NaN
alert( isFinite(Infinity) ); // false,因為是一個特殊的值:Infinity

請注意,在所有數字函數中,包括 isFinite,空字符串或僅有空格的字符串均被視為 0。


與 Object.is 進行比較
有一個特殊的內建方法 Object.is,它類似於 === 一樣對值進行比較,但它對於兩種邊緣情況更可靠:

它適用於 NaN:Object.is(NaN,NaN) === true,這是件好事。
值 0 和 -0 是不同的:Object.is(0,-0) === false,從技術上講這是對的,因為在內部,數字的符號位可能會不同,即使其他所有位均為零。
在所有其他情況下,Object.is(a,b) 與 a === b 相同。

這種比較方式經常被用在 JavaScript 規范中。當內部算法需要比較兩個值是否完全相同時,它使用 Object.is(內部稱為 SameValue)。

parseInt 和 parseFloat
使用加號 + 或 Number() 的數字轉換是嚴格的。如果一個值不完全是一個數字,就會失敗:

alert( +"100px" ); // NaN

唯一的例外是字符串開頭或結尾的空格,因為它們會被忽略。
但在現實生活中,我們經常會有帶有單位的值,例如 CSS 中的 "100px" 或 "12pt"。並且,在很多國家,貨幣符號是緊隨金額之后的,所以我們有 "19€",並希望從中提取出一個數值。

這就是 parseInt 和 parseFloat 的作用。

它們可以從字符串中“讀取”數字,直到無法讀取為止。如果發生 error,則返回收集到的數字。函數 parseInt 返回一個整數,而 parseFloat 返回一個浮點數:

alert( parseInt('100px') ); // 100
alert( parseFloat('12.5em') ); // 12.5

alert( parseInt('12.3') ); // 12,只有整數部分被返回了
alert( parseFloat('12.3.4') ); // 12.3,在第二個點出停止了讀取
某些情況下,parseInt/parseFloat 會返回 NaN。當沒有數字可讀時會發生這種情況:

alert( parseInt('a123') ); // NaN,第一個符號停止了讀取

parseInt(str, radix)` 的第二個參數
parseInt() 函數具有可選的第二個參數。它指定了數字系統的基數,因此 parseInt 還可以解析十六進制數字、二進制數字等的字符串:

alert( parseInt('0xff', 16) ); // 255
alert( parseInt('ff', 16) ); // 255,沒有 0x 仍然有效

alert( parseInt('2n9c', 36) ); // 123456

其他數學函數
JavaScript 有一個內建的 Math 對象,它包含了一個小型的數學函數和常量庫。

幾個例子:

Math.random()
返回一個從 0 到 1 的隨機數(不包括 1)

alert( Math.random() ); // 0.1234567894322
alert( Math.random() ); // 0.5435252343232
alert( Math.random() ); // ... (任何隨機數)
Math.max(a, b, c...) / Math.min(a, b, c...)
從任意數量的參數中返回最大/最小值。

alert( Math.max(3, 5, -10, 0, 1) ); // 5
alert( Math.min(1, 2) ); // 1
Math.pow(n, power)
返回 n 的給定(power)次冪

alert( Math.pow(2, 10) ); // 2 的 10 次冪 = 1024
Math 對象中還有更多函數和常量,包括三角函數,你可以在 Math 對象文檔 中找到這些內容。

總結
要寫有很多零的數字:

將 "e" 和 0 的數量附加到數字后。就像:123e6 與 123 后面接 6 個 0 相同。
"e" 后面的負數將使數字除以 1 后面接着給定數量的零的數字。例如 123e-6 表示 0.000123(123 的百萬分之一)。
對於不同的數字系統:

可以直接在十六進制(0x),八進制(0o)和二進制(0b)系統中寫入數字。
parseInt(str,base) 將字符串 str 解析為在給定的 base 數字系統中的整數,2 ≤ base ≤ 36。
num.toString(base) 將數字轉換為在給定的 base 數字系統中的字符串。
要將 12pt 和 100px 之類的值轉換為數字:

使用 parseInt/parseFloat 進行“軟”轉換,它從字符串中讀取數字,然后返回在發生 error 前可以讀取到的值。
小數:

使用 Math.floor,Math.ceil,Math.trunc,Math.round 或 num.toFixed(precision) 進行舍入。
請確保記住使用小數時會損失精度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM