超碰人人人人人,色婷婷综合久久久久中文一区二区,国产-第1页-浮力影院,欧美老妇另类久久久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點(diǎn)晴永久免費(fèi)OA]js parseInt之0.0000001陷阱分析小結(jié)【javascript】

admin
2015年3月9日 16:15 本文熱度 10753
:我的費(fèi)用報(bào)銷申請(qǐng)單金額自動(dòng)計(jì)算多了0.0000001,不知道多的 0.0000001 怎么來(lái)的,計(jì)算總數(shù)字沒(méi)錯(cuò),我檢查了JS也沒(méi)問(wèn)題。


 

 


 



js parseInt的陷阱分析小結(jié),當(dāng)?shù)谝粋€(gè)字符為0時(shí),Js會(huì)把它看成一個(gè)8進(jìn)制數(shù)字,其他8進(jìn)制之外的字符都回被忽略掉。
var a = parseInt("09"), b = Number("09");

很多人會(huì)認(rèn)為a和b的值都是數(shù)字9,但實(shí)際上不是。

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

parseInt會(huì)根據(jù)radix指定的進(jìn)制進(jìn)行轉(zhuǎn)換,比如:
alert(parseInt("10", 2)); // outputs '2'

在沒(méi)有指定radix或者radix為0的情況下,parseInt會(huì)按十進(jìn)制進(jìn)行轉(zhuǎn)換。然而,這在某些情況下有點(diǎn)特殊:

* 如果string的值以“0x”開(kāi)頭,parseInt會(huì)按十六進(jìn)制進(jìn)行轉(zhuǎn)換;
* 如果string的值以“0”開(kāi)頭,parseInt會(huì)按八進(jìn)制進(jìn)行轉(zhuǎn)換。

說(shuō)回開(kāi)頭的代碼,由于"09"是以“0”開(kāi)頭,所以parseInt會(huì)按八進(jìn)制進(jìn)行轉(zhuǎn)換,但是“9”不是合法的八進(jìn)制值(八進(jìn)制只有0-7八個(gè)數(shù)字),所以轉(zhuǎn)換結(jié)果是0。

要避免這個(gè)陷進(jìn),可以強(qiáng)制指定radix:
alert(parseInt("09", 10)); // outputs '9'

其它網(wǎng)友的補(bǔ)充:
看代碼:
alert(parseInt(0.000001));
alert(parseInt(0.0000001));

第一條語(yǔ)句輸出 0, 第二條語(yǔ)句輸出 1, 囧。

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

都輸出 0, 這才符合預(yù)期。

查看 ECMA-262 規(guī)范,parseInt 會(huì)先調(diào)用 toString 方法。問(wèn)題已逐漸清晰:


alert(0.000001);
alert(0.0000001);

第一條語(yǔ)句原樣輸出,第二條語(yǔ)句輸出 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 的單元測(cè)試腳本, 很好地詮釋了 ECMA 規(guī)范。

小結(jié):對(duì)于小于 1e-6 的數(shù)值來(lái)說(shuō),ToString 時(shí)會(huì)自動(dòng)轉(zhuǎn)換為科學(xué)計(jì)數(shù)法。因此 parseInt 方法,在參數(shù)類型不確定時(shí),最好封裝一層:

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

Javascript有兩種數(shù)據(jù)類型的轉(zhuǎn)換方法:
  一種是將整個(gè)值從一種類型轉(zhuǎn)換為另一種數(shù)據(jù)類型(稱作基本數(shù)據(jù)類型轉(zhuǎn)換),
  另一種方法是從一個(gè)值中提取另一種類型的值,并完成轉(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
  從一個(gè)值中提取另一種類型的值的如以下方法:
    1.提取字符串中的整數(shù):parseInt(); 例:parseInt("123zhang")的結(jié)果為123
    2.提取字符串中的浮點(diǎn)數(shù):parseFloat(); 例:parseFloat("0.55zhang")的結(jié)果為0.55

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

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