首頁 > web前端 > 前端問答 > javascript數值型有幾種

javascript數值型有幾種

青灯夜游
發布: 2022-10-14 17:11:26
原創
2242 人瀏覽過

javascript數值類型只有一種:浮點型別。 JavaScript內部儲存數字都是以64位元浮點數類型儲存的,所以在JavaScript中其實是沒有整數類型的。依照JavaScript中的數字格式能夠表示的整數範圍為“[-2^53 ~ 2^53]”,包含邊界值;但需要注意的是,數組索引、位元操作符等使用的是基於32位的整數。

javascript數值型有幾種

本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

在JavaScript中,數值型別只有一種,內部表示為64位元浮點數。所以在JavaScript中其實是沒有整數型的。

print(3/2); // 1.5
登入後複製

可見,數值都是以浮點數來處理的。

因為JavaScript內部儲存數字都是以64位元浮點數類型儲存的,無論整數和小數。容易造成混淆的是,某些位元運算必須要整數才可以運行,所以會自動將64位元浮點數轉換為32位元整數。再進行位元運算。在JavaScript中,1和1.0是一樣的

1 == 1.0 true
0.1+0.2 == 0.3 false
0.3/0.1 = 2.99999999996
(0.3-0.2) === (0.2-0.1) false
登入後複製

總之,涉及小數的運算要小心

按照JavaScript中的數字格式(IEEE-754定義的64位元浮點格式),能夠表示的整數範圍為[-2^53 ~ 2^53],包含邊界值。然而要注意的是,陣列索引、位元操作符等使用的是基於32位元的整數。

浮點數值的最高精度是17位小數,但在進行算術計算時其精確度遠不如整數。例如,0.1加0.2的結果不是0.3,而是0.30000000000000004。這個小小的捨入誤差會導致無法測試特定的浮點數值。

因為二進位浮點數可以精確地表示1/2、1/8等,但不能精確地表示1/10、1/100等。所以像0.1這樣的簡單數字也不能精確表示。

由於浮點數有精確度問題,可能會在比較時得到一此意想不到的結果:

print((0.1+0.2) == 0.3); // false
print(0.1+0.2);          // 0.30000000000000004
print(0.3);              // 0.3

print((10/3-3) == (1/3));// false
print(10/3-3);           // 0.3333333333333335
print(1/3);              // 0.3333333333333333
登入後複製

對於整數的情況,只要使用53位元以內的整數,則不會出現精度問題,放心使用。

除了以十進位表示外,整數還可以透過八進位(以8為基數)或十六進位(以16為基數)的字面值來表示。其中,八進製字面值的第一位必須是零(0),然後是八進制數字序列(0~7)。如果字面值中的數值超出了範圍,那麼前導零將被忽略,後面的數值將被當作十進制數值解析。

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

十六進位字面值的前兩個位元必須是0x,後面接著任何十六進位數字(0~9及A~F)。其中,字母 A~F 可以大寫,也可以小寫。

由於儲存浮點數值所需的記憶體空間是儲存整數值的兩倍,因此ECMAScript會不失時機地將浮點數值轉換為整數值。顯然,如果小數點後面沒有跟任何數字,那麼這個數值就可以當作整數值來保存。同樣地,如果浮點數值本身表示的就是一個整數(如1.0),那麼該值也會被轉換為整數。

數值物件

與字串值對應著一個字串物件一樣,數值也有對應的數值對象,也就是Number 。

數值同樣可以直接呼叫數值對應的屬性:

print((6).toString()); // 6
登入後複製

注意,本例中,數值需要加括號,否則句點會被認為是小數點。

Number的使用與String的使用類似,可以進行型別轉換、建立數值物件等。

在進行型別轉換時,如果轉換不成功,即Number回傳NaN,使用數值物件時也是如此。

var a = Number('x');
print(typeof a, a);       // number NaN
var b = new Number('x'); 
print(typeof b, b);       // object [Number: NaN]
登入後複製

Number有5個特殊屬性(唯讀),即:

  • MAX_VALUE         :正數最大值,再大就會變成Infinity

  • MIN_VALUE         :正數最小值,再小就會變成0

  • NaN               :Not a Number

  • NEGATIVE_INFINITY :負無窮大,即-Infinity

  • #POSITIVE_INFINITY :正無窮大,即Infinity

#
print(Number.MAX_VALUE);         // 1.7976931348623157e+308
print(Number.MIN_VALUE);         // 5e-324
print(Number.NaN);               // NaN
print(Number.NEGATIVE_INFINITY); // -Infinity
print(Number.POSITIVE_INFINITY); // Infinity
登入後複製

##Infinity##

print(isNaN(NaN));  // true
print(isNaN(0/0));  // true
登入後複製
登入後複製

##Infinity

##
print(isFinite(Number.NaN));               // false
print(isFinite(Number.NEGATIVE_INFINITY)); // false
print(isFinite(Number.POSITIVE_INFINITY)); // false
登入後複製
登入後複製

##」Infinity########## ##########當數字運算結果超過了JavaScript所能表示數字上限時,結果為一個特殊的無窮大值(Infinity),如果是負數的值超過了JavaScript所能表示的負數範圍,則結果為-Infinity。 ######當運算結果無限接近零並比JavaScript能表示的最小值還小的時候(下溢),結果為0,當負數發生下溢時,結果為-0,正數發生下溢,則結果為0。 ######JavaScript預先定義了全域變數Infinity和NaN,它們都是唯讀變數。 ###

由于内存的限制,ECMAScript并不能保存世界上所有的数值。ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中——在大多数浏览器中,这个值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE中——在大多数浏览器中,这个值是1.7976931348623157e+308。如果某次计算的结果得到了一个超出JavaScript数值范围的值,那么这个数值将被自动转换成特殊的Infinity值。具体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),如果这个数值是正数,则会被转换成Infinity(正无穷)。 

如果某次计算返回了正或负的Infinity值,那么该值将无法继续参与下一次的计算,因为Infinity不是能够参与计算的数值。要想确定一个数值是不是有穷的(换句话说,是不是位于最小和最大的数值之间),可以使用isFinite()函数。

NaN

NaN是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。

对于NaN,要记住的一点是,只要运算中出现NaN,结果就一定是NaN,就算是"NaN*0"这样的运算,也一样是NaN。只要对NaN运行比较运行,结果就一定是false,就算"NaN==NaN"/"NaN!=NaN"等,都是false。

要判断一个值是否为NaN,可以使用isNaN()函数:

print(isNaN(NaN));  // true
print(isNaN(0/0));  // true
登入後複製
登入後複製

在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值。

也可以使用x!==x来判断x是否为NaN,只有在x为NaN的时候,这个表达式的值才为true。

inFinite()

isFinite函数用于判断一个数是否为“正常”的数值:

print(isFinite(Number.NaN));               // false
print(isFinite(Number.NEGATIVE_INFINITY)); // false
print(isFinite(Number.POSITIVE_INFINITY)); // false
登入後複製
登入後複製

除了以上3个特殊值外,其他值的结果都为true

假如x是一个普通数值,则有:

x/0 = Infinity
x%0 = NaN
x/Infinity = 0
x%Infinity = x
0/0 = NaN
0%0 = NaN
Infinity/x = Infinity
Infinity%x = NaN
Infinity/Infinity = NaN
Infinity%Infinity = NaN
登入後複製

完整输出如下:

print(0 / 0);           // NaN
print(3 / 0);           // Infinity
print(Infinity / 0);    // Infinity
print(0 % 0);           // NaN
print(3 % 0);           // NaN
print(Infinity % 0);    // NaN
----------
print(0 / 4);           // 0
print(3 / 4);           // 0.75
print(Infinity / 4);    // Infinity
print(0 % 4);           // 0
print(3 % 4);           // 3
print(Infinity % 4);    // NaN
----------
print(0 / Infinity);           // 0
print(3 / Infinity);           // 0
print(Infinity / Infinity);    // NaN
print(0 % Infinity);           // 0
print(3 % Infinity);           // 3
print(Infinity % Infinity);    // NaN
登入後複製

负零与正零

负零与正零的值相等,不过毕竟带有符号,在一些运算中会有符号方面的差别,比如:

var zero = 0; 
var negz = -0;
登入後複製

此时,zero 等于 negz , 但1/zero 却不等于 1/negz。

【相关推荐:javascript视频教程编程基础视频

以上是javascript數值型有幾種的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板