JS 的 Math.floor()、Math.trunc()、~~num

#bitwise #integer #javascript

在 Javascript 裡面,整數、浮點數沒有區隔
比如我寫 11 / 2 會拿到 5.5,但在 Java 會拿到 5
因此在使用 Javascript 除法的時候,我們時常要在除法外面包一層 Math.floor()

我們的預期是 Math.floor(5.5) 會回傳 5
所以我們也預期 Math.floor(-5.5) 會回傳 -5……,但其實會回傳 -6

改用 Math.trunc() 就可以了,寫法是 Math.trunc(-5.5)



但其實還有一種神奇寫法:~~(-5.5)
MDN Bitwise NOT 的介紹中提到:每一個 ~ 都會把數字轉成 32-bit signed integer
如此一來就會達成我們要的「丟棄小數,只留整數」的目的

不過這樣的寫法有問題
Javascript 的整數涵蓋 -253 + 1 到 253 - 1 這麼大的範圍
這樣寫會把超過 32 bit 的資料丟掉,像是 ~~(2 ** 33 + 50) 這樣就只會回傳 50
Math.trunc() 的文件有一章專門在講這個:Using bitwise no-ops to truncate numbers



會知道這個,其實也是刷題時學到的
以前常會覺得「刷題的東西在工作上都用不到」
現在倒是覺得刷題是蠻開眼界的事情,而在這過程中便會學到一些工作上可以應用的技巧