最近幾天的函式都在取得附近的值,今天要介紹的是Math.round()
也是很類似!大家應該都很熟了,他就是四捨五入!!
「寐偲,繞!!!」
讓我們直接開始吧!
在英文中四捨五入叫rounding
,所以Math.round(x)
就是將x
取四捨五入。
Math.round(x)
放入一個數字。
他會將x
四捨五入到最接近的整數後回傳。
這個函式會回傳最接近x
的整數,如果有兩個數一樣接近x
,將會回傳較靠近+∞
的值。如果x
已經是整數就回傳x
。
下面的註記看一下:
「Math.round(3.5)
回傳4
,但是Math.round(-3.5)
回傳-3
。」
其實上面的規範很清楚,他寫道「如果有兩個數一樣接近x
,就回傳比較靠近+∞
的值。」,因為-3
跟-4
一樣靠近-3.5
,所以回傳了比較靠近+∞
的-3
,話雖如此,但這跟我們平常認知的四捨五入似乎有些出入。
在數學中,負數的四捨五入會先取絕對值轉正之後四捨五入,最後再加上負號就是結果,這點在使用上要特別注意。
下一句在說什麼呢:
「Math.round(x)
的值不完全等於Math.floor(x + 0.5)
的值。當x
是-0
或x
小於+0
但大於等於-0.5
,Math.round(x)
會回傳-0
,但Math.floor(x + 0.5)
會回傳+0
。Math.round(x)
的值也可能跟Math.floor(x + 0.5)
的值不同,因為x + 0.5
是在內部計算。」
我模擬了他會這麼寫的狀況:假設是Math.round(3.7)
,他會回傳4
,等同於Math.floor(3.7 + 0.5)
,因為我只要在任何數加上0.5
,如果沒有進位到整數部分,就表示他原本小數部分就會被四捨五入法捨去;但如果進位到整數,就表示他原本小數部分大於等於0.5
,就會被四捨五入法進位;但是假設是Math.round(-0.3)
,會回傳-0
,Math.floor(-0.3 + 0.5)
的結果會是+0
;再來就是因為雙精度浮點數的小數計算會有誤差,所以也可能導致Math.floor(x + 0.5)
裡面的值出現誤差,就不能如預期的丟入真實x + 0.5
的值了。
總而言之,正數使用的時候不太需要注意,但負數要使用的時候就要小心他的行為可能不如我們預期!
來使用看看吧!
console.log(Math.round(3.5)); //4
console.log(Math.round(-3.5)); //-3
console.log(Math.round(3.7)); //4
console.log(Math.round(-3.7)); //-4
console.log(Math.round(Infinity)); //Infinity
「寐偲,繞!!!」
明天見~
參考資料:
MDN-Math.round()
ECMAScript-Math.round()