javascript - js中向下取整
問(wèn)題描述
在js中,以前向下取整都是使用Math.floor方法,現(xiàn)在有看到這樣的用法:或運(yùn)算 interval = interval | 0為什么這樣就可以向下取整了,這種用法和Math.floor比較,有什么好處?
問(wèn)題解答
回答1:注意,| 不是邏輯或,而是按位或 (OR)。
一些小區(qū)別。比如 Math.floor(NaN) 還是返回 NaN。但 NaN | 0 返回 0。再比如 Math.floor(Infinity) 返回 Infinity,但 Infinity | 0 返回 0
回答2:你還可以這樣 interval = interval >> 0
回答3:首先樓上S1ngS1ng說(shuō)那些小區(qū)別是對(duì)的。
另外,|是位或運(yùn)算,由于0在內(nèi)存中存儲(chǔ)的時(shí)候,是所有的整數(shù)位全部被填充了0,所以按二進(jìn)制位和一個(gè)數(shù)值進(jìn)行或運(yùn)算,對(duì)應(yīng)位上無(wú)論是0還是1和0進(jìn)行或運(yùn)算,都會(huì)得到它本身,但是由于數(shù)字0在內(nèi)存中不存在小數(shù)部分,所以位或運(yùn)算之后interval的小數(shù)部分被丟棄。其實(shí)是通過(guò)丟棄小數(shù)部分實(shí)現(xiàn)了向下取整。
由于是位運(yùn)算,所以會(huì)比Math.floor()快。
回答4:真實(shí)的原因是:js內(nèi)部的類型自動(dòng)轉(zhuǎn)換。
js的數(shù)值都是以64位浮點(diǎn)型表示的。當(dāng)一個(gè)數(shù)值需要進(jìn)行位運(yùn)算時(shí),js會(huì)自動(dòng)將它轉(zhuǎn)換為32位有符號(hào)整形,并舍棄小數(shù)部分。
n|0 ; n>>0 ; //后面的0 僅用于保證n的整數(shù)值不變而已。
從64位降到32位,是會(huì)有精度損失的。小心!,最大有效范圍: 2^32/2-1
> f64=(Math.pow( 2,32)/2-1)-0.52147483646.5> f64|02147483646> f64>>02147483646> (f64 + 2)|0 //超出有效范圍-2147483648> (f64 + 2)>>0 //超出有效范圍-2147483648> Math.floor(f64 + 2) //正確2147483648回答5:
兩種都可以實(shí)現(xiàn), interval = interval | 0 這個(gè)是一個(gè)寫(xiě)作的技巧,看個(gè)人愛(ài)好吧。可能就是interval = interval | 0這種寫(xiě)法運(yùn)行會(huì)快一點(diǎn),寫(xiě)代碼這個(gè)也肯定比Math.floor寫(xiě)得快!
相關(guān)文章:
1. mysql 可以從 TCP 連接但是不能從 socket 鏈接2. java - jdbc如何返回自動(dòng)定義的bean3. javascript - 按鈕鏈接到另一個(gè)網(wǎng)址 怎么通過(guò)百度統(tǒng)計(jì)計(jì)算按鈕的點(diǎn)擊數(shù)量4. mysql updtae追加數(shù)據(jù)sql語(yǔ)句5. 怎么php怎么通過(guò)數(shù)組顯示sql查詢結(jié)果呢,查詢結(jié)果有多條,如圖。6. Python處理Dict生成json7. 大家都用什么工具管理mysql數(shù)據(jù)庫(kù)?8. python - 請(qǐng)問(wèn)這兩個(gè)地方是為什么呢?9. 請(qǐng)教一個(gè)mysql去重取最新記錄10. mysql的循環(huán)語(yǔ)句問(wèn)題
