javascript類型系統之Number

来源:http://www.cnblogs.com/xiaohuochai/archive/2016/01/04/5098363.html
-Advertisement-
Play Games

[1]整數 [2]浮點數 [3]舍入誤差 [4]數值範圍 [5]數值轉換 [6]繼承的方法 [7]其他方法


目錄
[1]整數 [2]浮點數 [3]舍入誤差 [4]數值範圍 [5]數值轉換 [6]繼承的方法 [7]其他方法

前面的話

  javascript只有一種數字類型,既可以表示32位的整數,還可以表示64位的浮點數。javascript使用IEEE754格式來表示數字,存在浮點計算精度問題

 

整數

  javascript的整數表示共有三種字面量格式是十進位、八進位、十六進位。但在進行算術計算時,所有以八進位和十六進位表示的數值最終都將被轉換成十進位數值

    [註意]javascript中可以保存正0和負0,且被認為相等

  [1]八進位字面值的第一位必須是0,然後是八進位數字序列(0-7)

    [註意]如果字面值中的數值超出了範圍,那麼前導0將被忽略,後面的數值被當作十進位數解析。八進位字面量在嚴格模式下是無效的,會導致javascript拋出錯誤

  [2]十六進位字面值的前兩位必須是0x,後跟十六進位數字序列,字母可大寫可小寫

    [註意]十六進位中字面值中的數值超出範圍,如出現g、h等會報錯

console.log(+0);//0
console.log(-0);//-0
console.log((+0) === (-0));//true
//num8代表8進位數,num16代表16進位數
var num8 = 012;
console.log(num8);//10
var num8 = 09;
console.log(num8);//9
var num16 = 0x11;
console.log(num16);//17
var num16 = 0xg;//報錯
console.log(num16);

 

浮點數

  浮點數是指有小數點或指數形式的數字。由於浮點型數值需要的記憶體空間是保存整數值的兩倍,因此javascript會不失時機地將浮點數值轉換成整數值,若小數點後沒有跟任何數字或者浮點值本身表示的就是一個整數,這個數值會作為整數值來保存

[digits][.digits][(E|e)[(+|-)]digits]

  [註意]浮點數只可用十進位表示

var num1 = 1.1;
var num2 = 1.;
var num3 = .1; 
console.log(num1,num2,num3);//1.1,1,0.1
var num1 = 011.1;//報錯
var num2 = 0x11.1;//報錯
var num3 = 011e1;//報錯
var num4 = 0x11e1;//出錯,會被識別成整數,結果為4577

科學計數法

  對於極大或者極小的數,可以用科學計數法e來表示的浮點數值來表示。預設情況下,javascript會將小於1且小數點後面帶有6個0以上的浮點數值轉換為以e表示法表示的數值

var num1 = 10e1;//100
var num2 = 10.1e-1;//1.01
var num3 = 1.0000001;//1.0000001
var num4 = 0.0000001;//1e-7
var num5 = 0.000001;//0.000001
console.log(num1,num2,num3,num4,num5);

 

舍入誤差

  javascript中的數字的最高精度是17位(若小於1,則為小數點後17位;若大於1,則去掉小數點後整體保留17位),但基於IEEE754數值的浮點計算的通病是舍入誤差的問題

console.log(0.123456789012345678);//0.12345678901234568
console.log(0.123456789012345678+0.000000000000000004);//0.12345678901234568
console.log(1.123456789012345678);//1.1234567890123457
console.log(10.123456789012345678);//10.123456789012346
console.log(12345678901234567890);//12345678901234567000
console.log(0.1+0.2);//0.300000000000000004

 

數值範圍

  javascript中的數值範圍(正數)是Number.MIN_VALUE —— Number.MAX_VALUE

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

Infinity

  如果超出正數範圍,輸出Infinity(正無窮大),超出負數範圍,輸出-Infinity(負無窮大)

console.log(Number.MAX_VALUE+1 === Number.MAX_VALUE);//true
console.log(Number.MAX_VALUE+ Number.MAX_VALUE === Infinity);//true
console.log(Number.MIN_VALUE+1);//1
console.log(Number.MIN_VALUE-1);//-1
console.log(-Number.MAX_VALUE-Number.MAX_VALUE);//-Infinity

  +Infinity的等價值是Number.POSITIVE_INFINITY;-Infinity的等價值是Number.NEGATIVE_INFINITY

  [註意]+-Infinity不能參與數值計算

console.log(Number.POSITIVE_INFINITY === Infinity)//true
console.log(Number.NEGATIVE_INFINITY === -Infinity)//true
console.log(Infinity - 1);//Infinity
console.log(Infinity - Infinity);//NaN

  可以用isFinite()來確定一個數值是不是有窮的,包含著隱式類型轉換Number()。如果是無窮數或者NaN時返回false,否則為true

console.log(isFinite(Infinity))//false
console.log(isFinite(NaN))//false
console.log(isFinite(Number.MAX_VALUE))//true

NaN

  NaN(not a number)表示非數字,NaN與任何值都不相等,包括NaN本身,且任何涉及NaN的操作都會返回NaN。isNaN()來判斷這個數字是不是NaN,包含著隱式類型轉換Number()

console.log(NaN == NaN);//false
console.log(NaN == Infinity);//false
console.log(isNaN(Infinity));//false
console.log(isNaN(0));//false
console.log(isNaN(NaN));//true

 

數值轉換

  有3個函數可以把非數值轉換成數值:Number()、parseInt()和parseFloat()

Number()

  Number()可用於任何數據類型的轉換

  Number(true): 1 || Number(false):0

  Number(各種進位的數字):運算後的十進位的數字,如1.0或1.或01會以1輸出

  Number(undefined):NaN

  Number(null):0

console.log(Number(true),Number(false));//1 0
console.log(Number(11),Number(011),Number(0x11));//11 9 17
console.log(Number(undefined),Number(null));//NaN 0

  Number(字元串):

  在解析字元串時會識別前置空格並去掉

    Number(只包含十進位或十六進位的數字的字元串):運算後的十進位的數字

      [註意]字元串中不識別八進位,按照十進位數字處理

    Number(''和' '):0

    Number(其他情況的字元串):NaN

      [註意]字元串'1.2.'不會報錯,但數字1.2.會報錯

console.log(Number('    123'));//123
console.log(Number('1.2.'));//NaN
console.log(Number('1.2.'));//報錯
console.log(Number(''),Number(' '));//0 0 
console.log(Number('11'),Number('011'),Number('0x11'));//11 11 17
console.log(Number('abc'));//NaN

  Number(對象):

    Number([]和[0]和[-0]):0

    Number([數字]):運算後的數字

    Number([1,2]和{}和其他對象):NaN

console.log(Number([]),Number([0]),Number([-0]),Number([0,0]));//0 0 0 NaN
console.log(Number([1]),Number([-1]));//1 -1
console.log(Number([1,2]),Number({}));//NaN NaN

  [註意]可以用一個值-0來將其轉換成一個數字,有隱式類型轉換Number()

console.log(typeof ('123'-0),'123'-0);//number 123
console.log(typeof ('123px'-0),'123px'-0);//number NaN
console.log(typeof (true-0),true-0);//number 1 
console.log(typeof ([]-0),[]-0);//number 0

 

parseInt()

  parseInt()專門用於把字元串轉換成數值。在轉換字元串時,會忽略字元串前面的空格,直到找到第一個非空格字元。如果第一個字元不是數字字元或者負號,parseInt()就會返回NaN。如果是,則繼續解析,直到解析完成或者遇到非數字字元

console.log(parseInt('    123px'));//123
console.log(parseInt('   123   '));//123
console.log(parseInt(' -123px'));//-123
console.log(parseInt('a123px'));//NaN
console.log(parseInt('0 123px'));//0

  parseInt()可以識別出各種進位的數字,輸出的是運算後的十進位的數字,如1.0或1.或01會以1輸出。在解析八進位字面量的字元串,ECMAScript3會解析八進位,但ECMAScript5沒有解析八進位的能力

console.log(parseInt('11'));//11
console.log(parseInt(11));//11
console.log(parseInt('11.1'));//11
console.log(parseInt(11.1));//11
console.log(parseInt('011'));//11
console.log(parseInt(011));//9
console.log(parseInt('011.1'));//11
console.log(parseInt(011.1));//報錯
console.log(parseInt('0x11'));//17
console.log(parseInt(0x11));//17
console.log(parseInt('0x11.1'));//17
console.log(parseInt(0x11.1));//報錯

  parseInt()函數提供第二個參數,表示多少進位

console.log(parseInt('11',2));//3
console.log(parseInt('11',8));//9
console.log(parseInt('11',10));//11
console.log(parseInt('11',16));//17

  因為parseInt()是專門用來處理字元串轉換數字的,所以parseInt處理非字元串和數字類型時輸出NaN

  [註意]]parseInt([數字或字元串])輸出對應的數字

console.log(parseInt(null),parseInt(undefined));//NaN NaN
console.log(parseInt(true),parseInt(false));//NaN NaN
console.log(parseInt([]),parseInt(['2.5px']),parseInt([2.5]));//NaN 2 2
console.log(parseInt(''),parseInt(' '),parseInt({}));//NaN NaN NaN

 

parseFloat()

  類似於parseInt(),專門用於字元串轉換數字。解析時會忽略字元串前面的空格,直到找到第一個非空格字元,然後一直解析到字元串末尾或一個無效的浮點數字字元為止

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()可以識別不同進位的數字,但只能解析十進位字元串

console.log(parseFloat('11'));//11
console.log(parseFloat(11));//11
console.log(parseFloat('11.1'));//11.1
console.log(parseFloat(11.1));//11.1
console.log(parseFloat('011'));//11
console.log(parseFloat(011));//9
console.log(parseFloat('011.1'));//11.1
console.log(parseFloat(011.1));//報錯
console.log(parseFloat('0x11'));//0
console.log(parseFloat(0x11));//17
console.log(parseFloat('0x11.1'));//0
console.log(parseFloat(0x11.1));//報錯

  因為parseFloat()是專門用來處理字元串轉換數字的,所以parseFloat處理非字元串和數字類型時輸出NaN

  [註意]parseFloat([數字或字元串])輸出對應的數字

console.log(parseFloat(null),parseFloat(undefined));//NaN NaN
console.log(parseFloat(true),parseFloat(false));//NaN NaN
console.log(parseFloat([]),parseFloat([2.1]),parseFloat(['2.1px']));//NaN 2.1 2.1 
console.log(parseFloat(''),parseFloat({}));//NaN NaN

 

繼承的方法

  Number類型是與數字值對應的包裝類型,繼承了引用類型的通用方法

  valueOf():返回基本類型的數值

  toString()和toLocaleString():返回字元串形式的數值

console.log(typeof 1.1.valueOf(),1.1.valueOf());//number 1.1
console.log(typeof 1.1.toString(),1.1.toString());//String '1.1'
console.log(typeof 1.1.toLocaleString(),1.1.toLocaleString());//String '1.1'
console.log(typeof 1.valueOf(),1.valueOf());//報錯
console.log(typeof 1.toString(),1.toString());//報錯
console.log(typeof 1.toLocaleString(),1.toLocaleString());//報錯
var num = 1;
console.log(typeof num.valueOf(),num.valueOf());//number 1
console.log(typeof num.toString(),num.toString());//String '1'
console.log(typeof num.toLocaleString(),num.toLocaleString());//String '1'

  [註意]可以為toString()方法傳遞一個表示基數的參數

var num = 10;
console.log(num.toString());//'10'
console.log(num.toString(2));//'1010'
console.log(num.toString(8));//'12'
console.log(num.toString(10));//'10'
console.log(num.toString(16));//'a'    

 

其他方法

toFixed()

  按照指定的小數位返回數值四捨五入後的字元串表示(常用於處理貨幣值)

    [註意]toFixed()里的參數只接受0-20,若不傳參則相當於參數是0

var num = 10.456;
console.log(num.toFixed(2));//10.46
console.log(num.toFixed());//10
console.log(num.toFixed(-1));//報錯

toExponential()

  返回指數表示法(e表示法)的數值的字元串表示,參數表示轉換後的小數位數

  [註意]toExponential()里的參數只接受0-20,若不傳參則相當於不針對小數進行四捨五入

var num = 10.456;
console.log(num.toExponential(2));//1.05e+1
console.log(num.toExponential());//1.0456e+1    
console.log(num.toExponential(21));//報錯

toPrecision()

  接收一個參數即表示數值的所有數字的位數(不包括指數部分)自動調用toFixed()或toExponential()

   [註意]toFixed()里的參數只接受1-21,若不傳參則不對原數字進行任何操作

var num = 10.1;
console.log(num.toPrecision(3));//10.1
console.log(num.toPrecision(2));//10        
console.log(num.toPrecision(1));//1e+1
console.log(num.toPrecision());//10.1

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 接上一篇日曆插件FullCalendar應用:(一)數據展現。這一篇主要講使用fullcalendar插件如何做數據的增刪改,用到了art.dialog web對話框組件,上一篇用到的webForm來展現數據,這一篇使用mvc模式來對數據進行增刪改查。1、準備工作本人用的SQLServer2012,...
  • 作者:漫凱維奇 來源:【教程】jQuery打造動態下滑菜單Tip:這隻是一個轉載,源代碼可以在上面的來源博文中下載此教程將分步講解如何使用JQuery和CSS打造一個炫酷動感菜單。效果如下:效果實現步驟如下:1.HTML結構的實現,跟平常的菜單代碼沒有什麼區別: Home...
  • 全選反選 布爾屬性,只要name即可,...
  • table切換 1 2 3 4 5
  • <h2 CSS 尺寸 (Dimension) 實例</h2 <h3 CSS 實例</h3 CSS 背景實例 CSS 文本實例 CSS 字體(font)實例 CSS 邊框(border)實例 CSS 外邊距 (margin) 實例 CSS 內邊距 (padding) 實例 CSS 列表實例 CSS ....
  • jq-get方法test.json文件:[{"name": "艷艷","pass": "123456","age": "26"},{"name": "張三","pass": "88888888","age": "28"},{"name": "李四","pass": "111111"
  • $("p").eq(0).css("color") //因為eq(num)返回的是個jq對象,所以可以用jq的方法css使用get來獲得第一個p標簽的color值;$("p").get(0).style.color //因為get(num)返回的是個html對象,所以要使用傳統的HTML對象方法,j...
  • 獲取JavaScript 的時間使用內置的Date函數完成var mydate = new Date();mydate.getYear(); //獲取當前年份(2位)mydate.getFullYear(); //獲取完整的年份(4位,1970-????)mydate.getMonth(); //獲...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...