在 JavaScript 中,對數值進行四舍五入操作的場景有以下幾種:
- 向上取整:ceil
- 向下取整:floor
- 四舍五入:round
- 固定精度:toFixed
- 固定長度:toPrecision
- 取整:parseInt、位運算
本文將對這 6 個 API 進行簡單的講解和總結。
1、向上取整: ceil
ceil 是`天花板`的意思,表示在一個數值之上,且距離該數最近的整數。ceil 是 Math 對象的靜態方法,需要傳遞一個參數,其調用方法如下:
Math.ceil(12.34); //13 Math.ceil(12.68); //13
2、向下取整: floor
floor 是`地板`的意思,表示在一個數值之下,且距離該數最近的整數。floor 是 Math 對象的靜態方法,需要傳遞一個參數,其調用方法如下:
Math.floor(12.34); // 12 Math.floor(12.68); // 12
3、四舍五入: round
round 的作用是對一個浮點數進行四舍五入,並保留整數位。round 也是 Math 對象的靜態方法,也需要傳遞一個參數,其調用方法如下:
Math.round(12.34); // 12 Math.round(12.54); // 13
4、固定精度: toFixed
toFixed 和上面三個方法不同,它是 Number 原型上實現的一個方法,其作用是對一個浮點數進行四舍五入並保留固定小數位。 toFixed 需要傳遞一個參數,其調用方式如下:
100.456001.toFixed(2); // 100.46 100.456001.toFixed(3); // 100.456
5、固定長度: toPrecision
toPrecison 也是 Number 原型上實現的一個處理浮點數的方法,和 toFixed 不同的是,它是對一個浮點數進行四舍五入並保留固定長度的有效數字,包括整數部分。
99.456001.toPrecision(5); // 99.456 100.456001.toPrecision(5); // 100.46
6、取整: parseInt
parseInt 是 全局對象 window上的一個方法,其作用是對一個可轉換的數值取整,分為以下兩種情況:
1. 將字符串數值轉化為 Number 整數,對字符串的每一個字符進行轉化,直到遇到不可轉化的字符(包括小數點)停止。
2. 對浮點類型數值取整,忽略小數部分,不做四舍五入處理
// 字符串數值 parseInt('100') ; // 100 parseInt('100axt'); // 100 parseInt('100xh20'); // 100 parseInt('100.78'); // 123 // Number 類型 parseInt(100.12) ; // 100 parseInt(100.78); // 100
7、取整: 位運算
- | 0 : 和 0 進行 按位或 操作,原值不變
- ~~ : 兩次 按位非 操作得到的也是原值
- >> 0 : 右移 0 位
- << 0 : 左移 0 位
- >>> 0: 無符號右移 0 位
這些位運算符在實現取整操作時,會表現出一些共同的特征:
- 對於 Number 類型來說,直接應用位操作, 和 parseInt 得到的結果幾乎一樣;
- 對於其他類型,內部會先通過 Number() 將其轉換為一個數值,然后再應用位操作。
- 對特殊 NaN 和 Infinity 值應用位操作時,這兩個值都會被當成 0 來處理 。
對於 Number 類型,直接應用位運算。
~~ 100.12; // 100 100.78 | 0; // 100 100.45 >> 0; // 100 100.50 << 0; // 100 100.96 >>> 0; // 100
對於其他類型,先使用 Number() 轉換為數值類型,再進行位運算。
~~ '100.12' // 100, Number('100.12') == 100.12 '100.50' >> 0; // 100,Number('100.50') == 100.50 '100.96' << 0; // 100,Number('100.96') == 100.96 ~~ 'abc' // 0 , Number('abc') == NaN '12abc' >> 0; // 0, Number('12abc') == NaN undefined | 0 ; // 0, Number(undefined) == NaN ~~null; // 0 , Number(null) == 0 true >> 0; // 1 , Number(true) == 1 false >> 0; //0 , Number(false) == 0 [] << 0; // 0 , Number([]) == 0 ~~NaN; // 0 Infinity >>> 0; // 0
位運算作用於最基本的層次上,即按內存中表示數值的位來操作數值。
位運算能取整的原因是:
ECMAScript 中的數值以64位雙精度浮點數存儲,但位運算只能作用於整數,因此要先將 64 位的浮點數轉換成 32 位的整數,然后再進行位運算,最后再將計算結果轉換成64位浮點數存儲。
原創發布 @ 一像素 2018.06