欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

跟我學(xué)習(xí)javascript的浮點(diǎn)數(shù)精度

 更新時(shí)間:2015年11月16日 09:45:54   作者:小平果118  
跟我學(xué)習(xí)javascript的浮點(diǎn)數(shù)精度,帶大家真正的理解JavaScript的浮點(diǎn)數(shù),提醒大家當(dāng)心浮點(diǎn)運(yùn)算中的精度陷阱,需要的朋友可以參考下

大多數(shù)編程語(yǔ)言都有幾種數(shù)值型數(shù)據(jù)類型,但是JavaScript卻只有一種。你可以使用typeof 運(yùn)算符查看數(shù)字的類型。不管是整數(shù)還是浮點(diǎn)數(shù),JavaScript都將它們簡(jiǎn)單地歸類為數(shù)字。

typeof 17; //number
typeof 98.6; //number
typeof -21.3; //number

事實(shí)上,JavaScript中所有的數(shù)字都是雙精度浮點(diǎn)數(shù)。這是由IEEE754標(biāo)準(zhǔn)制定的64位編碼數(shù)字——即“doubles”。如果這一事實(shí)使你疑惑JavaScript是如何表示整數(shù)的,請(qǐng)記住,雙精度浮點(diǎn)數(shù)能完美地表示高達(dá)53位精度的整數(shù)。從–9 007 199 254 740 992(–253)到9 007 199 254 740 992(253)的所有整數(shù)都是有效的雙精度浮點(diǎn)數(shù)。因此,盡管JavaScript中缺少明顯的整數(shù)類型,但是完全可以進(jìn)行整數(shù)運(yùn)算。
大多數(shù)的算術(shù)運(yùn)算符可以使用整數(shù)、實(shí)數(shù)或兩者的組合進(jìn)行計(jì)算。

0.1 * 0.9; //0.19
-99 + 100; //1
21- 12.3; //8.7
2.5 /5; //0.5
21%8; //5

然而位算術(shù)運(yùn)算符比較特殊。JavaScript不會(huì)直接將操作數(shù)作為浮點(diǎn)數(shù)進(jìn)行運(yùn)算,而是會(huì)將其隱式地轉(zhuǎn)換為32位整數(shù)后進(jìn)行運(yùn)算。(確切地說(shuō),它們被轉(zhuǎn)換為32位大端(big-endian)的2的補(bǔ)碼表示的整數(shù)。)以按位或運(yùn)算表達(dá)式為例:

8|1; //9

看似簡(jiǎn)單的表達(dá)式實(shí)際上需要幾個(gè)步驟來(lái)完成運(yùn)算。如前所述,JavaScript中的數(shù)字8和1都是雙精度浮點(diǎn)數(shù)。但是它們也可以表示成32位整數(shù),即32位0、1的序列。整數(shù)8表示為32位二進(jìn)制序列如下所示:

00000000000000000000000000001000

你自己也可以使用數(shù)字類型的toString方法來(lái)查看:

(8).toString(2)  //"1000"

toString方法的參數(shù)指定了其轉(zhuǎn)換基數(shù),此例子以基數(shù)2(即二進(jìn)制)表示。結(jié)果值省略了左端多余的0(位),因?yàn)樗鼈儾⒉挥绊懽罱K值。
整數(shù)1表示為32位二進(jìn)制如下所示:

00000000000000000000000000000001

按位或運(yùn)算表達(dá)式合并兩個(gè)比特序列。只要參與運(yùn)算的兩位比特中任意一位為1,運(yùn)算結(jié)果的該位就為1。以位模式表示的結(jié)果如下:

00000000000000000000000000001001

這個(gè)序列表示整數(shù)9。你可以使用標(biāo)準(zhǔn)的庫(kù)函數(shù)parseInt驗(yàn)證,同樣以2作為基數(shù):

parseInt("1000", 2); //9

(同樣,前導(dǎo)0位是不必要的,因?yàn)樗鼈儾⒉挥绊戇\(yùn)算結(jié)果。)
所有位運(yùn)算符的工作方式都是相同的。它們將操作數(shù)轉(zhuǎn)換為整數(shù),然后使用整數(shù)位模式進(jìn)行運(yùn)算,最后將結(jié)果轉(zhuǎn)換為標(biāo)準(zhǔn)的JavaScript浮點(diǎn)數(shù)。一般情況下,JavaScript引擎需要做些額外的工作來(lái)進(jìn)行這些轉(zhuǎn)換。因?yàn)閿?shù)字是以浮點(diǎn)數(shù)存儲(chǔ)的,必須將其轉(zhuǎn)換為整數(shù),然后再轉(zhuǎn)換回浮點(diǎn)數(shù)。然而,在某些情況下,算術(shù)表達(dá)式甚至變量只能使用整數(shù)參與運(yùn)算,優(yōu)化編譯器有時(shí)候可以推斷出這些情形而在內(nèi)部將數(shù)字以整數(shù)的方式存儲(chǔ)以避免多余的轉(zhuǎn)換。

關(guān)于浮點(diǎn)數(shù)的最后警示是,你應(yīng)該對(duì)它們保持時(shí)刻警惕。浮點(diǎn)數(shù)看似熟悉,但是它們是出了名的不精確。甚至一些看起來(lái)最簡(jiǎn)單的算術(shù)運(yùn)算都會(huì)產(chǎn)生不正確的結(jié)果。

0.1+0.2; 0.300000000000004

盡管64位的精度已經(jīng)相當(dāng)高了,但是雙精度浮點(diǎn)數(shù)也只能表示一組有限的數(shù)字,而不能表示所有的實(shí)數(shù)集。浮點(diǎn)運(yùn)算只能產(chǎn)生近似的結(jié)果,四舍五入到最接近的可表示的實(shí)數(shù)。當(dāng)你執(zhí)行一系列的運(yùn)算,隨著舍入誤差的積累,運(yùn)算結(jié)果會(huì)越來(lái)越不精確。舍入也會(huì)使我們通常所期望的算術(shù)運(yùn)算定律產(chǎn)生一些出人意料的偏差。例如,實(shí)數(shù)滿足結(jié)合律,這意味著,對(duì)于任意的實(shí)數(shù)x,y,z,總是滿足(x + y) + z = x + (y + z)。

然而,對(duì)于浮點(diǎn)數(shù)來(lái)說(shuō),卻并不總是這樣。

(0.1+0.2)+0.3; //0.60000000000000001
0.1+(0.2+ 0.3); //0.6

浮點(diǎn)數(shù)權(quán)衡了精度和性能。當(dāng)我們關(guān)心精度時(shí),要小心浮點(diǎn)數(shù)的局限性。一個(gè)有效的解決方法是盡可能地采用整數(shù)值運(yùn)算,因?yàn)檎麛?shù)在表示時(shí)不需要舍入。當(dāng)進(jìn)行貨幣相關(guān)的計(jì)算時(shí),程序員通常會(huì)按比例將數(shù)值轉(zhuǎn)換為最小的貨幣單位來(lái)表示再進(jìn)行計(jì)算,這樣就可以以整數(shù)進(jìn)行計(jì)算。例如,如果上面的計(jì)算是以美元為單位,那么,我們可以將其轉(zhuǎn)換為整數(shù)表示的美分進(jìn)行計(jì)算。

(10+20)+30; //60
10+ (20+30); //60

對(duì)于整數(shù)運(yùn)算,你不必?fù)?dān)心舍入誤差,但是你還是要當(dāng)心所有的計(jì)算只適用于–253~253的整數(shù)。

提示

  • JavaScript的數(shù)字都是雙精度的浮點(diǎn)數(shù)。
  • JavaScript中的整數(shù)僅僅是雙精度浮點(diǎn)數(shù)的一個(gè)子集,而不是一個(gè)單獨(dú)的數(shù)據(jù)類型
  • 位運(yùn)算符將數(shù)字視為32位的有符號(hào)整數(shù)。

以上就是介紹的javascript的浮點(diǎn)數(shù),我們要時(shí)刻注意浮點(diǎn)運(yùn)算中的精度陷阱,希望這篇文章對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

最新評(píng)論