js除了Math.floor方法,还可以通过位运算|,>>实现向下取整

更新日期: 2018-01-10阅读量: 4704标签: 运算

我们都知道通过Math.floor()方法可实现数值的向下取整,得到小于或等于该数字的最大整数。


语法如下:

Math.floor(x)

说明:x必需,并且是一个数值。

1.如果是字符串(非数字类型'1.01'以外),输出NaN;
2.如果是true,则输出1,false为0


Math.floor()实例:

console.log(Math.floor(0.8));//输出0
console.log(Math.floor(-0.8));//输出-1
console.log(Math.floor(1));//输出1
console.log(Math.floor('d'));//如果不是数值,输出NaN

如果参数是一个涉及浮点数的表达式,那么可能会出现不准的问题,如下:

Math.floor(0.5+0.49999999999999999);//输出1

而实际上它结算的结果应该小于1,输出应该是0的,这里怎么就变成了1呢?原因这里有:理解并如何解决js中浮点数计算不精准的问题


位运算实现向下取整

除了上面的常用方法外,在一些地方我们还可能会看到使用位运算来实现向下取整。例如:

console.log(0.8 | 0);//输出0
console.log(-0.8 | 0);//输出0
console.log(1 | 0);//输出1

或者使用>>:

console.log(0.8 >> 0);//输出0
console.log(-0.8 >> 0);//输出0
console.log(1 >> 0);//输出1


位运算实现的原因:

这是由于js内部的类型自动转换,js数值都是由64位浮点型表示的,当进行位运算的时候,会自动转换为32为有符号的整数,并舍弃小数位。所以就可以实现向下取整了。


位运算和Math.floor()的差别:

1.精度的损失,最大有效范围: 2^32/2-1

var a=(Math.pow( 2,32)/2-1)+0.5;//a=2147483647.5
a | 0;
a >> 0;
Math.floor(a);
//结果都为2147483647
a+=1;
a | 0;//输出-2147483648
a >> 0;//输出-2147483648
Math.floor(a);//输出2147483648

2.当值为负数的时候,会位运行的结果和Math.floor不一致:

console.log(Math.floor(-0.8));//输出-1  
console.log(-0.8 | 0);//输出0  
console.log(-0.8 >> 0);//输出0

只是由于它先进行转为32位的整数,再在进行舍去小数位,最后转变为负数的结果。


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: https://www.fly63.com/article/detial/345

斐波那契列数JS的三种实现

大家是怎么实现斐波那契列数的,再给两种解法,对比一下,还有一种更简单的用的是数组存储

js中的位运算及用法

位运算是在数字底层(即表示数字的 32 个数位)进行运算的。由于位运算是低级的运算操作,所以速度往往也是最快的(相对其它运算如加减乘除来说),并且借助位运算有时我们还能实现更简单的程序逻辑,缺点是很不直观

javascript逻辑运算符有哪些?

JavaScript逻辑运算符有&&(逻辑与)、||(逻辑或)、!(逻辑非)。JavaScript逻辑运算符用于测定变量或值之间的逻辑。

理解JS 中相等和全等操作符比较规则

在日常的 JS 编码过程中,可能很难看到相等运算符(=)是如何工作的。特别是当操作数具有不同类型时。这有时会在条件语句中产生一些难以识别的 bug。很容易理解为什么 0 == 8 是 flase 。但是为什么{} == true是 false 的就看不出来了

JS 中一些高效的魔法运算符

JavaScript 现在每年都会发一个新版本,里面也会新增一些操作更加便利、高效的运算符。今天我们就来盘点下几个高效的魔法运算符。

javascript如何四舍五入?

javascript四舍五入的方法:方法一、使用toFixed()方法可把Number四舍五入为指定小数位数的数字。方法二、使用round()方法可把一个数字舍入为最接近的整数。

(a == 1 && a == 2 && a == 3)为true,你所不知道的那些答案

看到这个标题,一部分同学的第一反应可能是,又是这个老套的问题,人家都讲过好多遍了你还讲。同学,你想错啦。我可不是在炒冷饭。今天我们要从这个问题,延伸出更多的知识,保证超出你的预期

Js中NaN不等于NaN

断点调试之后发现无论如何都不相等,方法parseInt()返回的结果确实是NaN,但是与右侧的NaN比较返回的结果却是false,这时候才突然想起来NaN有不等于自身的特性

【leetcode】64. 条件求和,递归+移位运算

求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

JavaScript 保留两位小数

在开发中展示点赞数时,当数量级超过10000后,需要使用更加简洁的小数式去显现数量(例如1.22万)。下面就给大家分享数量小数式后保留两位小数的实现方式。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!