javascript中小数转换为整数

还是去年的时候有同事随口问我在javascript中怎么把小数转换成整数(去掉小数位),当时我回答直接用parseInt。其实那时候也没有仔细考虑这个问题还有没有其他的方法。不过最近在看别人一篇博文里的代码时,发现他这么写代码

var random = (Math.random() * 2) | 0; // get random 0 or 1
我们都知道javascript的Number其实就是双精度浮点数,而Math.random() * 2 很明显随即出来的是[0 ~ 2)之间的小数,他通过与0或的方式,把小数部分去掉了,cool!
 
这种方式的原理就是利用javascript做位运算时(bitwise operation)会先把操作数通过无符号右移的方式变为32位整数,而与0进行按位或显然不会改变整数的值,所以可以通过这样的方式把小数转化成整数,去掉小数部分。所以我们应该能猜到 (true | 0)会得到1, “123”|0会得到123。同理,也可以通过 & 4294967295的方式来达到同样的目的。
 
其实还有好几种简单方法可以去掉小数部分把小数转化成整数,下面列出来
 
第二种:两次取反,同样是利用位操作转换原理。
var integer = ~~decimal; // 4 = ~~4.123
第三种:利用向上取整数与向下取整数的数学函数, Math.ceil和Math.floor
var integer = decimal >= 0 ? Math.floor(decimal) : Math.ceil(decimal);
当然还有更复杂的方式,不过经过Robert Koritnik测试,还是与0或的方式更快,推荐大家使用:)
 
不过还是要提醒一下大家,第一种和第二种方式对操作数的范围有要求(因为是转换成32位整数),所以如果值本身超过了32位整数所能表示的范围,那么将会因为信息丢失而出现错误的结果。比如2147483648 | 0 的结果是-2147483648 。~~4294967296的结果是0。32位带符号整数最大是2147483647,所以这种方法要求小数的整数部分在-2147483648 到 2147483647之间。
 
posted @ 2014-08-26 21:50  WanChengCheng  阅读(6809)  评论(0编辑  收藏  举报