javascript - js中向下取整
问题描述
在js中,以前向下取整都是使用Math.floor方法,现在有看到这样的用法:或运算 interval = interval | 0为什么这样就可以向下取整了,这种用法和Math.floor比较,有什么好处?
问题解答
回答1:注意,| 不是逻辑或,而是按位或 (OR)。
一些小区别。比如 Math.floor(NaN) 还是返回 NaN。但 NaN | 0 返回 0。再比如 Math.floor(Infinity) 返回 Infinity,但 Infinity | 0 返回 0
回答2:你还可以这样 interval = interval >> 0
回答3:首先楼上S1ngS1ng说那些小区别是对的。
另外,|是位或运算,由于0在内存中存储的时候,是所有的整数位全部被填充了0,所以按二进制位和一个数值进行或运算,对应位上无论是0还是1和0进行或运算,都会得到它本身,但是由于数字0在内存中不存在小数部分,所以位或运算之后interval的小数部分被丢弃。其实是通过丢弃小数部分实现了向下取整。
由于是位运算,所以会比Math.floor()快。
回答4:真实的原因是:js内部的类型自动转换。
js的数值都是以64位浮点型表示的。当一个数值需要进行位运算时,js会自动将它转换为32位有符号整形,并舍弃小数部分。
n|0 ; n>>0 ; //后面的0 仅用于保证n的整数值不变而已。
从64位降到32位,是会有精度损失的。小心!,最大有效范围: 2^32/2-1
> f64=(Math.pow( 2,32)/2-1)-0.52147483646.5> f64|02147483646> f64>>02147483646> (f64 + 2)|0 //超出有效范围-2147483648> (f64 + 2)>>0 //超出有效范围-2147483648> Math.floor(f64 + 2) //正确2147483648回答5:
两种都可以实现, interval = interval | 0 这个是一个写作的技巧,看个人爱好吧。可能就是interval = interval | 0这种写法运行会快一点,写代码这个也肯定比Math.floor写得快!
相关文章:
1. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)2. mysql - SQL操作时间的函数?3. MYSQL新建用户设置可以远程访问的问题4. docker内创建jenkins访问另一个容器下的服务器问题5. javascript - 用表单提交两个时间段请求后台返回对应数据时出现的一些问题!6. angular.js - angularjs的自定义过滤器如何给文字加颜色?7. node.js - nodejs和前端JavaScript 字符串处理结果不一样是什么原因?8. java - mybatis怎么实现在数据库中有就修改,没有就添加9. 正则表达式 - python pandas的sep参数问题10. javascript - ionic run android报错
