公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

[點晴永久免費OA]js parseInt之0.0000001陷阱分析小結【javascript】

admin
2015年3月9日 16:15 本文熱度 10821
:我的費用報銷申請單金額自動計算多了0.0000001,不知道多的 0.0000001 怎么來的,計算總數字沒錯,我檢查了JS也沒問題。


 

 


 



js parseInt的陷阱分析小結,當第一個字符為0時,Js會把它看成一個8進制數字,其他8進制之外的字符都回被忽略掉。
var a = parseInt("09"), b = Number("09");

很多人會認為a和b的值都是數字9,但實際上不是。

parseInt的主要作用是把字符串轉換為整數,或者把小數轉換為整數。一般情況下,我們只用到它的第一個參數。但實際上,它有兩個參數:
parseInt(string, radix)

parseInt會根據radix指定的進制進行轉換,比如:
alert(parseInt("10", 2)); // outputs '2'

在沒有指定radix或者radix為0的情況下,parseInt會按十進制進行轉換。然而,這在某些情況下有點特殊:

* 如果string的值以“0x”開頭,parseInt會按十六進制進行轉換;
* 如果string的值以“0”開頭,parseInt會按八進制進行轉換。

說回開頭的代碼,由于"09"是以“0”開頭,所以parseInt會按八進制進行轉換,但是“9”不是合法的八進制值(八進制只有0-7八個數字),所以轉換結果是0。

要避免這個陷進,可以強制指定radix:
alert(parseInt("09", 10)); // outputs '9'

其它網友的補充:
看代碼:
alert(parseInt(0.000001));
alert(parseInt(0.0000001));

第一條語句輸出 0, 第二條語句輸出 1, 囧。

繼續看代碼:
alert(parseInt('0.000001'));
alert(parseInt('0.0000001'));

都輸出 0, 這才符合預期。

查看 ECMA-262 規范,parseInt 會先調用 toString 方法。問題已逐漸清晰:


alert(0.000001);
alert(0.0000001);

第一條語句原樣輸出,第二條語句輸出 1e-7.
繼續翻查 ECMA-262 9.8.1 ToString Applied to the Number Type 一節,恍然大悟:
assertEquals("0.00001", (0.00001).toString());
assertEquals("0.000001", (0.000001).toString());
assertEquals("1e-7", (0.0000001).toString());
assertEquals("1.2e-7", (0.00000012).toString());
assertEquals("1.23e-7", (0.000000123).toString());
assertEquals("1e-8", (0.00000001).toString());
assertEquals("1.2e-8", (0.000000012).toString());

上面是 V8 引擎 number-tostring 的單元測試腳本, 很好地詮釋了 ECMA 規范。

小結:對于小于 1e-6 的數值來說,ToString 時會自動轉換為科學計數法。因此 parseInt 方法,在參數類型不確定時,最好封裝一層:

function parseInt2(a) {
if(typeof a === 'number') {
return Math.floor(a);
}
return parseInt(a);
}

Javascript有兩種數據類型的轉換方法:
  一種是將整個值從一種類型轉換為另一種數據類型(稱作基本數據類型轉換),
  另一種方法是從一個值中提取另一種類型的值,并完成轉換工作。
  基本數據類型轉換的如以下三種方法:
    1.轉換為字符型:String(); 例:String(678)的結果為"678"
    2.轉換為數值型:Number(); 例:Number("678")的結果為678
    3.轉換為布爾型:Boolean(); 例:Boolean("aaa")的結果為true
  從一個值中提取另一種類型的值的如以下方法:
    1.提取字符串中的整數:parseInt(); 例:parseInt("123zhang")的結果為123
    2.提取字符串中的浮點數:parseFloat(); 例:parseFloat("0.55zhang")的結果為0.55

另外總結各種類型轉換的方法
Number轉化成字符串:String(number)、
  Number.toString(2/8/16);//分別代表二進制\八進制\十六進制默認(無參)10進制
  Number.toFixed(3) //保留小數點后3位
  Number.toExponextial(3); //小數點前1位、小數點后3位,如var n=123456.789; n.toExponextial(3);//1.234e+5即1.234X105
  Number.toPrecision(4); //返回指定位數 如果位數不夠完全顯示,則按指數表示法(3個方法都會4舍5入)

該文章在 2015/3/9 16:15:29 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国偷自产av一区二区三区接 | 国产精品成v人在线视午夜片 | 高潮又爽又黄又无遮挡免费软件 | av日韩国产在线 | 国产高潮视频免费观看 | 91精品夜夜夜一区二区 | 18禁裸乳无遮挡 | 成年女人a毛片免费观看 | 91人妻一区二区三区久久 | 国产1卡2卡三卡四卡久久网站 | 成人免费一区二区三区视频软件 | 国产91精品久久二区二区 | 精品人妻av一区二区三区 | 国产精品爆乳奶水无码视频 | 国产av激情久久无码天堂 | 国产在线观看99re | 国产精品亚洲av毛片一区二区 | 国产无套白浆视频在线观看 | 国产成人精品一区二区 | 国产成在线观看免费视 | 国产亚洲欧美日韩在线观 | 18禁美女黄网站色大片在线 | 国产精品一区二区久久蜜臀内射 | 成人午夜福利a片在线观看 成人午夜福利电影 | 国产精品一区二区三区免费 | 国产福利视频一区 | 国产精品视频一区二区三区免费 | 精品久久久无码人妻中文字幕麻豆 | 福利视频一区二区 | 国产区91精品在线 | 国产精品免费观在线 | 国产精品无码无卡在线观看 | 91精品综合在线偷观看视频 | 91精品亚洲国 | 99久久精品一区二区三区 | 国产精品无码一区二区三区毛 | 国产精品亚洲综合一区 | 国产精品国语自产拍在线观看 | 大尺度做爰无遮挡动漫 | 国产v片在线播放免费无码 国产v片在线播放免费无遮挡 | 国产av一区二区三区日韩 |