Fork me on GitHub

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

 

posted @ 2016-01-19 11:07  一像素  阅读(...)  评论(... 编辑 收藏