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