[點晴永久免費OA]js parseInt之0.0000001陷阱分析小結(jié)【javascript】
當(dāng)前位置:點晴教程→點晴OA辦公管理信息系統(tǒng)
→『 經(jīng)驗分享&問題答疑 』
![]() ![]() ![]() ![]() js parseInt的陷阱分析小結(jié),當(dāng)?shù)谝粋€字符為0時,Js會把它看成一個8進制數(shù)字,其他8進制之外的字符都回被忽略掉。 var a = parseInt("09"), b = Number("09"); 很多人會認為a和b的值都是數(shù)字9,但實際上不是。 parseInt的主要作用是把字符串轉(zhuǎn)換為整數(shù),或者把小數(shù)轉(zhuǎn)換為整數(shù)。一般情況下,我們只用到它的第一個參數(shù)。但實際上,它有兩個參數(shù): parseInt(string, radix) parseInt會根據(jù)radix指定的進制進行轉(zhuǎn)換,比如: alert(parseInt("10", 2)); // outputs '2' 在沒有指定radix或者radix為0的情況下,parseInt會按十進制進行轉(zhuǎn)換。然而,這在某些情況下有點特殊: * 如果string的值以“0x”開頭,parseInt會按十六進制進行轉(zhuǎn)換; * 如果string的值以“0”開頭,parseInt會按八進制進行轉(zhuǎn)換。 說回開頭的代碼,由于"09"是以“0”開頭,所以parseInt會按八進制進行轉(zhuǎn)換,但是“9”不是合法的八進制值(八進制只有0-7八個數(shù)字),所以轉(zhuǎn)換結(jié)果是0。 要避免這個陷進,可以強制指定radix: alert(parseInt("09", 10)); // outputs '9' 其它網(wǎng)友的補充: 看代碼: alert(parseInt(0.000001)); alert(parseInt(0.0000001)); 第一條語句輸出 0, 第二條語句輸出 1, 囧。 繼續(xù)看代碼: alert(parseInt('0.000001')); alert(parseInt('0.0000001')); 都輸出 0, 這才符合預(yù)期。 查看 ECMA-262 規(guī)范,parseInt 會先調(diào)用 toString 方法。問題已逐漸清晰: alert(0.000001); alert(0.0000001); 第一條語句原樣輸出,第二條語句輸出 1e-7. 繼續(xù)翻查 ECMA-262 9.8.1 ToString Applied to the Number Type 一節(jié),恍然大悟: 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 規(guī)范。 小結(jié):對于小于 1e-6 的數(shù)值來說,ToString 時會自動轉(zhuǎn)換為科學(xué)計數(shù)法。因此 parseInt 方法,在參數(shù)類型不確定時,最好封裝一層: function parseInt2(a) { if(typeof a === 'number') { return Math.floor(a); } return parseInt(a); } Javascript有兩種數(shù)據(jù)類型的轉(zhuǎn)換方法: 一種是將整個值從一種類型轉(zhuǎn)換為另一種數(shù)據(jù)類型(稱作基本數(shù)據(jù)類型轉(zhuǎn)換), 另一種方法是從一個值中提取另一種類型的值,并完成轉(zhuǎn)換工作。 基本數(shù)據(jù)類型轉(zhuǎn)換的如以下三種方法: 1.轉(zhuǎn)換為字符型:String(); 例:String(678)的結(jié)果為"678" 2.轉(zhuǎn)換為數(shù)值型:Number(); 例:Number("678")的結(jié)果為678 3.轉(zhuǎn)換為布爾型:Boolean(); 例:Boolean("aaa")的結(jié)果為true 從一個值中提取另一種類型的值的如以下方法: 1.提取字符串中的整數(shù):parseInt(); 例:parseInt("123zhang")的結(jié)果為123 2.提取字符串中的浮點數(shù):parseFloat(); 例:parseFloat("0.55zhang")的結(jié)果為0.55 另外總結(jié)各種類型轉(zhuǎn)換的方法 Number轉(zhuǎn)化成字符串:String(number)、 Number.toString(2/8/16);//分別代表二進制\八進制\十六進制默認(無參)10進制 Number.toFixed(3) //保留小數(shù)點后3位 Number.toExponextial(3); //小數(shù)點前1位、小數(shù)點后3位,如var n=123456.789; n.toExponextial(3);//1.234e+5即1.234X105 Number.toPrecision(4); //返回指定位數(shù) 如果位數(shù)不夠完全顯示,則按指數(shù)表示法(3個方法都會4舍5入) 該文章在 2015/3/9 16:15:29 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |