js除了Math.floor方法,还可以通过位运算|,>>实现向下取整
我们都知道通过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);//输出21474836482.当值为负数的时候,会位运行的结果和Math.floor不一致:
console.log(Math.floor(-0.8));//输出-1
console.log(-0.8 | 0);//输出0
console.log(-0.8 >> 0);//输出0只是由于它先进行转为32位的整数,再在进行舍去小数位,最后转变为负数的结果。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!