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

时间: 2018-01-10阅读: 4453标签: 运算

我们都知道通过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.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

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

如何得到一个数据流中的中位数?

如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流

哈夫曼树的js实现

哈夫曼树是数据压缩编码算法的基础,本文使用JavaScript语言实现了该算法。算法流程:输入待编码的字符串,算法去构造哈夫曼树,从而实现对字符串的二进制压缩编码。

javascript如何计算1!+2!+..+10!的阶乘和?

JavaScript中计算1到10的阶乘和可以使用双层循环实现,在内层循环计算1到10的阶乘,然后在外层循环定义一个累加器将每个数的阶乘累加即可。

JS中==、===你分清楚了吗?

==、===都是相等运算符,这个大家应该都知道,但二者有什么区别呢?其实==是相等,===是严格相等,那他们有什么本质的区别呢?下面我就给大家细细道来。

js 检验四则运算字符串是否合法

是可以通过检验的,并且在js中也是按数学表达式计算结果的, 但是这个算不算“合格”的数学表达式呢?这个就看具体情况了吧,要规避也比较简单

Js中NaN不等于NaN

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

JS保留两位小数

以下处理结果会四舍五入:以下处理结果不会四舍五入第一种,先把小数边整数:第二种,当作字符串,使用正则匹配:注意:如果是负数,请先转换为正数再计算,最后转回负数

js各种取整方式及方法_四舍五入、向上取整、向下取整

js实现:四舍五入、向上取整、向下取整等方法。parseInt、Math.ceil、Math.round、Math.floor、toFixed等的使用

在JavaScript中使用Spread运算符的8种方法

延展操作运算符将可迭代的对象扩展为其单独的元素,可迭代对象是可以使用 for 循环进行循环的任何对象。可迭代的示例:Array,String,Map,Set,DOM节点。

JavaScript 中的求值策略

最近在研究 lambda演算 中的 η-变换 在 JavaScript 中的应用,偶然在 stackoverflow 上看到一个比较有意思的问题。关于 JavaScript 的求值策略,问JS中函数的参数传递是按值传递还是按引用传递?回答很经典。

点击更多...

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