事實上,JavaScript中所有的數(shù)字都是雙精度浮點數(shù)。這是由IEEE754標(biāo)準(zhǔn)制定的64位編碼數(shù)字——即“doubles”。如果這一事實使你疑惑JavaScript是如何表示整數(shù)的,請記住,雙精度浮點數(shù)能完美地表示高達(dá)53位精度的整數(shù)。從–9 007 199 254 740 992(–253)到9 007 199 254 740 992(253)的所有整數(shù)都是有效的雙精度浮點數(shù)。因此,盡管JavaScript中缺少明顯的整數(shù)類型,但是完全可以進(jìn)行整數(shù)運算。
大多數(shù)的算術(shù)運算符可以使用整數(shù)、實數(shù)或兩者的組合進(jìn)行計算。
然而位算術(shù)運算符比較特殊。JavaScript不會直接將操作數(shù)作為浮點數(shù)進(jìn)行運算,而是會將其隱式地轉(zhuǎn)換為32位整數(shù)后進(jìn)行運算。(確切地說,它們被轉(zhuǎn)換為32位大端(big-endian)的2的補碼表示的整數(shù)。)以按位或運算表達(dá)式為例:
看似簡單的表達(dá)式實際上需要幾個步驟來完成運算。如前所述,JavaScript中的數(shù)字8和1都是雙精度浮點數(shù)。但是它們也可以表示成32位整數(shù),即32位0、1的序列。整數(shù)8表示為32位二進(jìn)制序列如下所示:
00000000000000000000000000001000
你自己也可以使用數(shù)字類型的toString方法來查看:
(8).toString(2) //"1000"
toString方法的參數(shù)指定了其轉(zhuǎn)換基數(shù),此例子以基數(shù)2(即二進(jìn)制)表示。結(jié)果值省略了左端多余的0(位),因為它們并不影響最終值。
整數(shù)1表示為32位二進(jìn)制如下所示:
00000000000000000000000000000001
按位或運算表達(dá)式合并兩個比特序列。只要參與運算的兩位比特中任意一位為1,運算結(jié)果的該位就為1。以位模式表示的結(jié)果如下:
00000000000000000000000000001001
這個序列表示整數(shù)9。你可以使用標(biāo)準(zhǔn)的庫函數(shù)parseInt驗證,同樣以2作為基數(shù):
(同樣,前導(dǎo)0位是不必要的,因為它們并不影響運算結(jié)果。)
所有位運算符的工作方式都是相同的。它們將操作數(shù)轉(zhuǎn)換為整數(shù),然后使用整數(shù)位模式進(jìn)行運算,最后將結(jié)果轉(zhuǎn)換為標(biāo)準(zhǔn)的JavaScript浮點數(shù)。一般情況下,JavaScript引擎需要做些額外的工作來進(jìn)行這些轉(zhuǎn)換。因為數(shù)字是以浮點數(shù)存儲的,必須將其轉(zhuǎn)換為整數(shù),然后再轉(zhuǎn)換回浮點數(shù)。然而,在某些情況下,算術(shù)表達(dá)式甚至變量只能使用整數(shù)參與運算,優(yōu)化編譯器有時候可以推斷出這些情形而在內(nèi)部將數(shù)字以整數(shù)的方式存儲以避免多余的轉(zhuǎn)換。
關(guān)于浮點數(shù)的最后警示是,你應(yīng)該對它們保持時刻警惕。浮點數(shù)看似熟悉,但是它們是出了名的不精確。甚至一些看起來最簡單的算術(shù)運算都會產(chǎn)生不正確的結(jié)果。
0.1+0.2; 0.300000000000004
盡管64位的精度已經(jīng)相當(dāng)高了,但是雙精度浮點數(shù)也只能表示一組有限的數(shù)字,而不能表示所有的實數(shù)集。浮點運算只能產(chǎn)生近似的結(jié)果,四舍五入到最接近的可表示的實數(shù)。當(dāng)你執(zhí)行一系列的運算,隨著舍入誤差的積累,運算結(jié)果會越來越不精確。舍入也會使我們通常所期望的算術(shù)運算定律產(chǎn)生一些出人意料的偏差。例如,實數(shù)滿足結(jié)合律,這意味著,對于任意的實數(shù)x,y,z,總是滿足(x + y) + z = x + (y + z)。
然而,對于浮點數(shù)來說,卻并不總是這樣。
浮點數(shù)權(quán)衡了精度和性能。當(dāng)我們關(guān)心精度時,要小心浮點數(shù)的局限性。一個有效的解決方法是盡可能地采用整數(shù)值運算,因為整數(shù)在表示時不需要舍入。當(dāng)進(jìn)行貨幣相關(guān)的計算時,程序員通常會按比例將數(shù)值轉(zhuǎn)換為最小的貨幣單位來表示再進(jìn)行計算,這樣就可以以整數(shù)進(jìn)行計算。例如,如果上面的計算是以美元為單位,那么,我們可以將其轉(zhuǎn)換為整數(shù)表示的美分進(jìn)行計算。
對于整數(shù)運算,你不必?fù)?dān)心舍入誤差,但是你還是要當(dāng)心所有的計算只適用于–253~253的整數(shù)。
提示
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com