JavaScript數(shù)據(jù)結(jié)構(gòu)Number
前言:
Number
是JavaScript
的基本數(shù)據(jù)結(jié)構(gòu),是對(duì)應(yīng)數(shù)值的應(yīng)用類型。要?jiǎng)?chuàng)建一個(gè) Number 對(duì)象,就使用 Number 構(gòu)造函數(shù)并傳入一個(gè)數(shù)值。在 JavaScript 中沒(méi)有其他語(yǔ)言這么多的數(shù)字類型。根據(jù) ECMAScript 標(biāo)準(zhǔn),數(shù)字只有一種類型,它是“雙精度 64 位二進(jìn)制格式 IEEE 754 值”。這種類型用于存儲(chǔ)整數(shù)和分?jǐn)?shù),相當(dāng)于 Java 和 C 中的 double 數(shù)據(jù)類型。這個(gè)獨(dú)特性也就導(dǎo)致了 0.1+0.2 為什么不等于 0.3。本文介紹JavaScript使用 Number 的常見(jiàn)問(wèn)題。
先來(lái)看下下面的代碼:
console.log(0.1 + 0.2); // 0.30000000000000004
從上面運(yùn)行結(jié)果可以看出 0.1+0.2 不等于 0.3。只有分母為 2 的冪的分?jǐn)?shù)才能有限地表示為二進(jìn)制形式. 由于 0.1 (1 / 10) 和 0.2 (1 / 5) 的分母不是 2 的冪,因此這些數(shù)字不能以二進(jìn)制格式有限地表示。為了將它們存儲(chǔ)為 IEEE-754 浮點(diǎn)數(shù),它們必須四舍五入到尾數(shù)的可用位數(shù)——半精度為 10 位,單精度為 23 位,雙精度為 52 位。根據(jù)可用的精度位數(shù),0.1 和 0.2 的浮點(diǎn)近似值可能比相應(yīng)的十進(jìn)制表示略小或略大,但永遠(yuǎn)不會(huì)相等。因?yàn)檫@個(gè)事實(shí),永遠(yuǎn)不會(huì)有 0.1+0.2 == 0.3。
一、NaN和Infinity
NaN 代表Not a Number
并且它不同于 Infinity
,盡管兩者通常在實(shí)數(shù)的浮點(diǎn)表示以及浮點(diǎn)運(yùn)算中都作為特殊情況處理。NaN 是一個(gè)特殊的值,它是唯一一個(gè)不等于自身的值,來(lái)看看下面的代碼理解一個(gè)這個(gè)值:
const num = 9 + NaN; console.log(num); // NaN console.log(NaN == NaN); // false console.log(NaN === NaN); // false console.log(Object.is(NaN, NaN)); // true console.log(isNaN(NaN)); // true console.log(isNaN("devpoint")); // true console.log(Number.isNaN(NaN)); // true console.log(Number.isNaN("devpoint")); // false console.log(Number.isNaN(+"devpoint")); // true
Infinity
是 JavaScript 中的一個(gè)特殊值,表示數(shù)學(xué)無(wú)窮大和溢出值,數(shù)字太大以至于“溢出”緩沖區(qū)并導(dǎo)致 Infinity。它是計(jì)算創(chuàng)建超出 JavaScript 中特殊最大值的數(shù)字的結(jié)果,該值約為1.79e+308 或 2¹?²?,即 JavaScript 中可以存儲(chǔ)為數(shù)字原始類型的最大值。
注意 :Infinity,-Infinity 和 NaN 是 JavaScript 中唯一的“無(wú)限”(非有限)數(shù)字。
二、常用方法
在程序中處理數(shù)字是一個(gè)常見(jiàn)的需求,例如序號(hào)、費(fèi)用、溫度等等。下面通過(guò)代碼展示一些常用的與 Number 有關(guān)的方法。
1.安全數(shù)字
安全數(shù)字是一個(gè)數(shù)字,其值保證可以正常顯示。例如,如果有一個(gè)變量值為 900719925474099194 ,那么它是否安全?
下面來(lái)看 JavaScript 中安全數(shù)字的范圍是多少?如何驗(yàn)證?
- Number.MIN_SAFE_INTEGER:-9007199254740991
- Number.MAX_SAFE_INTEGER:9007199254740991
- Number.MAX_VALUE:1.7976931348623157e+308
- Number.MIN_VALUE:`5e-324
const test = 900719925474099194; console.log(Number.isSafeInteger(test)); // false console.log(Number.isSafeInteger(9007199254740991)); // true
2.整數(shù)判斷
在 JavaScript
中對(duì)于數(shù)字不區(qū)分整數(shù)、小數(shù)等類型,統(tǒng)稱為 Number 類型。從下面的代碼結(jié)果可以想到判斷整數(shù)的方法:
console.log(Number.isInteger(9)); // true console.log(Number.isInteger(9 / 2)); // false console.log(Number.isInteger(9.6)); // false console.log(9 % 1 === 0); // true console.log(9.1 % 1 === 0); // false const checkInteger = (num) => (num | 0) === num; console.log(checkInteger(9)); // true console.log(checkInteger(9.1)); // false console.log(checkInteger("9.0")); // false console.log(checkInteger("")); // false
3.數(shù)字格式判斷
下面的代碼片段將展示如何檢查一個(gè)值或變量是否包含一個(gè)數(shù)字(整數(shù)、浮點(diǎn)數(shù)等)。
function isNumber(n) { ? ? return !isNaN(parseFloat(n)) && isFinite(n); } console.log(isNumber(100)); // true console.log(isNumber(3.14)); // true console.log(isNumber("3.14")); // true console.log(isNumber("a3.14")); // false console.log(isNumber("JavaScript")); // false
4.四舍五入
在 JavaScript
中,對(duì)數(shù)值進(jìn)行四舍五入操作有很多的方式,下面來(lái)一一總結(jié)一下。
向上取整:
向上取整使用 Math.ceil()
,返回大于或等于 x ,并且與之最接近的整數(shù)。
console.log(Math.ceil(9.005)); // 10 console.log(Math.ceil(9.999)); // 10
四舍五入:
Math.round()
是對(duì)一個(gè)浮點(diǎn)數(shù)進(jìn)行四舍五入,并保留整數(shù)位。語(yǔ)法如下:
Math.round(x)
x :需要處理的數(shù)值
返回值,返回給定數(shù)字的四舍五入后的值。
console.log(Math.round(9.005)); // 9 console.log(Math.round(9.51)); // 10 console.log(Math.round(9.49)); // 9 console.log(Math.round(9.999)); // 10
固定精度:
.toFixed()
是 Number
原型上實(shí)現(xiàn)的一個(gè)方法,其作用是對(duì)一個(gè)浮點(diǎn)數(shù)進(jìn)行四舍五入并保留固定小數(shù)位。語(yǔ)法如下:
numObj.toFixed(digits)
digits:小數(shù)點(diǎn)后數(shù)字的個(gè)數(shù);介于 0 到 20 (包括)之間,實(shí)現(xiàn)環(huán)境可能支持更大范圍。如果忽略該參數(shù),則默認(rèn)為 0。
返回值,返回使用定點(diǎn)表示法表示給定數(shù)字的字符串。
const pi = 3.14159265359; console.log(pi.toFixed(2)); // 3.14 console.log(pi.toFixed(3)); // 3.142
固定長(zhǎng)度:
.toPrecison()
也是 Number 原型上實(shí)現(xiàn)的一個(gè)處理浮點(diǎn)數(shù)的方法,和 toFixed 不同的是,它是對(duì)一個(gè)浮點(diǎn)數(shù)進(jìn)行四舍五入并保留固定長(zhǎng)度的有效數(shù)字,包括整數(shù)部分。語(yǔ)法如下:
numObj.toPrecision(precision)
precision:可選,一個(gè)用來(lái)指定有效數(shù)個(gè)數(shù)的整數(shù)。
返回值,以定點(diǎn)表示法或指數(shù)表示法表示的一個(gè)數(shù)值對(duì)象的字符串表示,四舍五入到 precision 參數(shù)指定的顯示數(shù)字位數(shù)。
const pi = 3.14159265359; console.log(pi.toPrecision(3)); // 3.14 console.log(pi.toPrecision(4)); // 3.142
向下取整:
Math.floor()
返回小于或等于一個(gè)給定數(shù)字的最大整數(shù)。
Math.floor(x)
x:一個(gè)數(shù)字。
返回值,一個(gè)表示小于或等于指定數(shù)字的最大整數(shù)的數(shù)字。
console.log(Math.floor(9.005)); // 9 console.log(Math.floor(9.51)); // 9 console.log(Math.floor(9.49)); // 9 console.log(Math.floor(9.999)); // 9
5.生成隨機(jī)數(shù)
通過(guò)Math.random()
返回 0-1 之間的隨機(jī)數(shù)的原理,結(jié)果乘以最大數(shù)并四舍五入即可獲得一個(gè)介于 0 和 max 之間的數(shù)字。
const randomNumber = (max) => Math.round(Math.random() * max); console.log(randomNumber(100));
進(jìn)一步完善上面的方法以可以獲取指定最小和最大范圍的隨機(jī)數(shù)。
const randomNumber = (min, max) => ? ? Math.round(Math.random() * (max - min) + min); ? ? console.log(randomNumber(51, 100));
數(shù)學(xué)函數(shù) Math
是一個(gè)內(nèi)置對(duì)象,它擁有一些數(shù)學(xué)常數(shù)屬性和數(shù)學(xué)函數(shù)方法,Math 不是一個(gè)函數(shù)對(duì)象,Math 用于 Number 類型,但它不支持 BigInt。
三、總結(jié)
JavaScript
的 Number
對(duì)象是經(jīng)過(guò)封裝的能讓你處理數(shù)字值的對(duì)象。介紹了JavaScript 中唯一的“無(wú)限”(非有限)數(shù)子:Infinity,-Infinity 和 NaN ,并提供了一些常用的數(shù)字處理方法。
到此這篇關(guān)于JavaScript數(shù)據(jù)結(jié)構(gòu)Number的文章就介紹到這了,更多相關(guān)JavaScript-Number內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaScript樹(shù)形數(shù)據(jù)結(jié)構(gòu)處理
- JavaScript數(shù)據(jù)結(jié)構(gòu)與算法
- python庫(kù)JsonSchema驗(yàn)證JSON數(shù)據(jù)結(jié)構(gòu)使用詳解
- Javascript中扁平化數(shù)據(jù)結(jié)構(gòu)與JSON樹(shù)形結(jié)構(gòu)轉(zhuǎn)換詳解
- JavaScript?數(shù)據(jù)結(jié)構(gòu)之字典方法
- JavaScript數(shù)據(jù)結(jié)構(gòu)yocto queue隊(duì)列鏈表代碼分析
相關(guān)文章
js DIV滾動(dòng)條隨機(jī)位置的設(shè)置技巧
剛才一個(gè)朋友告訴我他的blog友情鏈接太多了,所以把所有鏈接放到一個(gè)DIV中,加了個(gè)滾動(dòng)條,可是他又不想每次別人來(lái)看,看到的都是前面幾個(gè)鏈接,于是問(wèn)我有沒(méi)有什么辦法,想了一個(gè),呵呵,正好有個(gè)辦法2008-11-11移動(dòng)端基礎(chǔ)事件總結(jié)與應(yīng)用
本文主要介紹了移動(dòng)端基礎(chǔ)事件總結(jié)與應(yīng)用,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01在Koa.js中實(shí)現(xiàn)文件上傳的接口功能
這篇文章主要介紹了在Koa.js中實(shí)現(xiàn)文件上傳的接口功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10JavaScript?TWaver使用中間點(diǎn)畫(huà)折線的方法
這篇文章主要介紹了JavaScript?TWaver使用中間點(diǎn)畫(huà)折線的方法,TWaver的圖形組件庫(kù)中提供了拓?fù)浣M件、地圖組件、設(shè)備圖組件,以及表格、樹(shù)圖、屬性表、圖表等豐富的通用圖形界面組件2022-07-07javascript下arguments,caller,callee,call,apply示例及理解
在看到大家如此關(guān)注JS里頭的這幾個(gè)對(duì)象,我試著把原文再修改一下,力求能再詳細(xì)的闡明個(gè)中意義2009-12-12JavaScript中字符串GBK與GB2312的編解碼示例講解
在瀏覽器JavaScript環(huán)境中,可以使用TextEncoder和TextDecoder?API?來(lái)進(jìn)行?GBK?編碼和解碼,也可以使用?encodeURIComponent?函數(shù)對(duì)字符串進(jìn)行編碼,最好使用第三方庫(kù),比如iconv-lite來(lái)實(shí)現(xiàn)2023-12-12JavaScript函數(shù)、方法、對(duì)象代碼
函數(shù)定義可以嵌套在其他函數(shù)中,常用作子函數(shù)。但不能出現(xiàn)在循環(huán)或條件語(yǔ)句中。2008-10-10js調(diào)用百度地圖及調(diào)用百度地圖的搜索功能
本文給大家介紹js調(diào)用百度地圖的方法以及調(diào)用百度地圖的搜索功能,有需要的朋友可以跟著腳本之家的小編一起學(xué)習(xí)2015-09-09JS實(shí)現(xiàn)單擊輸入框彈出選擇框效果完整實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)單擊輸入框彈出選擇框效果的方法,涉及JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)操作頁(yè)面元素與相關(guān)屬性的實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-12-12