首頁  >  文章  >  web前端  >  javascript -number類型值

javascript -number類型值

高洛峰
高洛峰原創
2017-02-25 16:16:351247瀏覽

大致介紹

在JavaScript的內部採用IEEE754格式來表示數字,所以不區分整數和浮點數,都是用64位元浮點數的形式儲存。就是說,在JavaScript內部,就根本沒有小數。但有些運算必須要整數完成,所以JavaScript有時會把64位元的浮點數轉換成32位元的整數,再進行運算。

整數

JavaScript對整數提供四個表示方法:

1、二進位:有前綴0b的數值,出現0,1以外的數字會報錯

2、八進位:有前綴0o的數值,或是以0後面再跟一個數字(0-7)。如果超出了前面所述的數值範圍,則會忽略第一個數字0,視為十進制數

注意:八進製字面量在嚴格模式下是無效的,會導致支援該模式的JavaScript引擎拋出錯誤

3、十六進位:有前綴0x,後面跟著任何十六進位數字(0~9及A~F),字母大小寫都可以,超出範圍會報錯

4、十進位


var num2 = 0b11;
 console.log(num2); //3
 var num2 = 0b12;
 console.log(num2); //报错
 var num8 = 0o76;
 console.log(num8); //02
 var num8 = 0o78;
 console.log(num8); //报错
 var num16 = 0x2a;
 console.log(num16); //42
 var num16 = 0x2h;
 console.log(num16) //报错


#浮點數

所謂浮點數,就是該數值中必須包含一個小數點,且小數點後面必須至少有一位數字。與整數不同,浮點數只能用十進位來表示

浮點數的精確度遠不如整數,所以設計浮點數的運算好比較要小心

例如:


 console.log(0.1 + 0.2 == 0.3); //false 0.30000000000000004
 console.log(0.6/0.2); //2.9999999999999996


科學計數法

對於那些極大極小的數值,可以用e表示法(即科學計數法)表示的浮點數值表示。用e表示法表示的數值等於e前面的數值乘以10的指數次方

以下兩種情況,JavaScript會自動將數值轉為科學計數法表示,其他情況都以字面形式直接表示。

1、小數點前的數字多餘21位元


#
 console.log(1234567890123456789012);// 1.2345678901234568e+21
 console.log(123456789012365648787); //123456789012365660000 


2、小數點後面的0多餘5位元


 console.log(0.0000006);//6e-7
 console.log(0.000006); //0.000006


數值範圍

#由於記憶體的限制,ECMAScript無法儲存世界上所有的數值,所以就有了最大值和最小值

最小值保存在Number.MIN_VALUE中,這個值是5e-324

最大值保存在Number.MAX_VALUE,這個值是1.7976931348623157e+308


 console.log(Number.MIN_VALUE) //5e-324
 console.log(Number.MAX_VALUE); //1.7976931348623157e+308


如果數字超過最大值,javascript會回傳Infinity,稱為正向溢出(overflow);如果等於或超過最小負值-1023(即非常接近0),javascript會直接把這個數轉為0,這稱為負向溢出(underflow)

如果要想確定一個數值是不是有窮的,可以使用isFinite()函數。這個函數在參數位於最小與最大數值之間時會傳回true


 var result = Number.MAX_VALUE + Number.MAX_VALUE;
 console.log(isFinite(result)); //false


特殊數值

1、+0和-0

這兩個0在大對數的情況下都是等價的


#
 -0 === +0; //true
 0 === -0; //true
 0 === +0; //true


但是在當分母的時候是不一樣的

1/-0 == 1/+0; //false

2、infinity

#Infinity表示“無窮”,用來表示兩種場景。一種是正的數值太大,或負的數值太小,無法表示;另一種是非0數值除以0,得到Infinity。


 Math.pow(2,Math.pow(2,100));//Infinity
 1/0;//Infinity


Infinity參與的運算結果只能是其本身、0或NaN


* Infinity;//Infinity
- Infinity;//-Infinity
+ Infinity;//Infinity
/ Infinity;//0
 Infinity / 2;//Infinity
 Infinity * Infinity;//Infinity
 Infinity - Infinity;//NaN
 Infinity + Infinity;//Infinity
 Infinity / Infinity;//NaN


3、NaN

#這個數值表示一個本來要傳回數值的運算元未傳回數值的情況

NaN與任何值不相等,包括它本身,並且涉及NaN的任何操作都會傳回NaN


##

 5 - 'x'; //NaN
 Math.acos(2); //NaN
 0 / 0; //NaN
 NaN == NaN;//false
 NaN == Infinity;//false


NaN不是一種獨立的資料型別,而是一種特殊數值,它的資料型別仍屬於Number

# typeof NaN; //number

isNaN方法可以用來判斷一個值是否為NaN,但是,isNaN只對數值有效,如果傳入其他值,會先轉成數值。例如,傳入字串的時候,字串會先轉成NaN,所以最後回傳true,這點要特別注意。也就是說,isNaN為true的值,有可能不是NaN,而是一個字串。


 isNaN('Hello') // true
 // 相当于
 isNaN(Number('Hello')) // true


判斷NaN更可靠的方法是,利用NaN是javascript之中唯一不等於自身的值這個特點,進行判斷


 function isNaN(value){
 return value != value;
 }


數位轉換

有3個函數可以把非數值轉換成數值:Number()、parseInt()和parseFloat()。其中Number()可以將任意型別的值轉換成數值,而parseInt()和parseFloat()只套用於字串向數字的轉換

Number()

#轉換規則:

1、如果是Boolean值,true和false將分別轉換為1和0

2、如果是null值,回傳0

3、如果是undefined,返回NaN

4、如果是字符串,遵循以下规则:

(1)若字符串只包含十进制或十六进制数字,则转成十进制的数字

注意:Number()不识别八进制数字的字符串,会按照十进制数字处理

字符串'1.2.'不会报错,但数字1.2.会报错

(2)若字符串为空字符串或空格字符串,则转成0

(3)其他情况的字符串,则转成NaN


Number(true) //1
 Number(null) //0
 Number(undefined) //NaN
 Number("0123") //123
 Number("0x123") //291
 Number("0.2") //0.2
 Number("") //0
 Number("asd") //NaN


parseInt()

parseInt()专门用于把字符串转换成整数。在转换字符串时,会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN。如果是,则继续解析,直到解析完成或者遇到非数字字符


 console.log(parseInt(' 123.8px'));//123
 console.log(parseInt(' 123.8 '));//123
 console.log(parseInt(' -123.8px'));//-123
 console.log(parseInt('a123.8px'));//NaN
 console.log(parseInt('0 123.8px'));//0


注意:在ECMAScript5中,parseInt()已经不具备解析八进制的能力。例如八进制“070”,会忽略前面的“0”,得到十进制的70

为了消除在使用parseInt()函数时可能导致的上述困惑,可以为这个函数提供第二个参数:转换时使用的基数(多少进制)


 parseInt("070") //70
 parseInt("070",8) //56


parseFloat()

parseFloat()专门用于字符串转换浮点数。同样地,解析时会忽略字符串前面的空格,直到找到第一个非空格字符,然后一直解析到字符串末尾或一个无效的浮点数字字符为止


console.log(parseFloat(' 0123.px'));//123
 console.log(parseFloat(' 123.px'));//123
 console.log(parseFloat(' 123.1px'));//123.1
 console.log(parseFloat(' 123.1.2px '));//123.1
 console.log(parseFloat(' -123.0px'));//-123
 console.log(parseFloat('.123.1px'));//0.123
 console.log(parseFloat('0 123px'));//0


注意:parseFloat()只解析十进制,所以十六进制的字符串始终会被转换成0。因此也没有第二个参数用来指定基数

 parseFloat("0xA") //0

注意:Number('')的结果是0,parseInt('')和parseFloat('')的结果是NaN

更多Number类型值相关文章请关注PHP中文网!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn