JavaScript 中的四舍五入


在 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM