把数字转换成整数的方法
)
方法一:Math函数
1.Math.floor()将其参数转换成小于且最接近它的整数(下取整)。
>Math.floor(3.8)
3
>Math.floor(-3.8)
-4
2.Math.ceil()将其参数转换成大于且最接近它的整数(上取整)。
>Math.ceil(3.2)
4
>Math.ceil(-3.2)
-3
3.Math.round()将其参数转换成最接近它的整数。
/*当数字为正值时,四舍五入*/
>Math.round(2.3)
2
>Math.round(2.5)
3
>Math.round(2.8)
3
/*当数字为负值时,Math.round(x)相当于Math.ceil(x+0.5)*/
>Math.round(-2.3)
-2
>Math.round(-2.5)
-2
>Math.round(-2.8)
-3
方法二:通过定制函数ToInteger()得到函数(JavaScript不一定支持)(ECMAScript内置ToInteger()方法,该方法会移除浮点数的小数部分)
该函数在JavaScript中的实现如下:
function ToInteger(x){
x=Number(x);
return x<0? Math.ceil(x):Math.floor(x);
}
测试结果如下:
>ToInteger(3.2)
3
>ToInteger(3.5)
3
>ToInteger(3.8)
3
>ToInteger(-3.2)
-3
>ToInteger(-3.5)
-3
>ToInteger(-3.8)
-3
方法三:通过位运算符得到32位整数
1.二进制或Or(|)
第二个操作数为0,不会改变任何位,结果为第一个操作数,被强制转换成了一个有符号的32位整数。
实现方法如下:
function ToInt32(x){
return x|0;
}
ToInt32()移除了小数部分,并且对2的32次方取模
测试结果如下:
>ToInt32(1.0001)
1
>ToInt32(1.999)
1
>ToInt32(Math.pow(2,32)+1)
1
>ToIn32(Math.pow(2,32)-1)
-1
方法四:通过全局函数parseInt()得到整数
parseInt()函数:
parseInt(str,radix?)
将字符串str(非字符串类型的值会被强制转换)解析成整数。该函数会忽略开头的空白字符并尽可能多地查找连续的合法字符。
radix(即)基数的范围是“大于等于2,且小于等于36”,它决定了数字被解析时的基数。如果基数大于10,会使用字母来表示0到9之外的数字(不区分大小写)。
如果没有设定基数,则基数默认是10,除非要解析的字符串以0x或者0X开头,此时基数被设为16(十六进制)。
如果str以0开头的话,有些引擎会将它们的基数设为8。
最好显式地声明基数,总是使用两个基数来调用parseInt()。
测试结果如下:
>parseInt('0xA')
10
>parseInt('0xA',16)
10
/*基数已经是16,十六进制的前缀可以省略*/
>parseInt('A',16)
10
>parseInt('010')
10
>parseInt('0101')
101
/*如果str以0开头的话,有些引擎会将它们的基数设为8*/
>parseInt('010')
8
>parseInt('0109')
8
不要使用parseInt()来转换数字成整数,因为有的时候会出现错误,例如:
>parseInt(1000000000000000000000.5,10)
1
>parseInt(0.0000008,10)
8
解释:
参数首先会被转换成字符串。
>String(1000000000000000000000.5)
"1e+21"
parseInt认为e不是整数,因此在1后面就停止解析了。
parseInt("1e+21",10)
1
总结:不应该使用parseInt()将数字转换成整数;强制转换成字符串会走不必要的弯路,且结果也不一定正确。
parseInt()对于解析字符串非常有用,但是必须注意函数在遇到第一个非法字符时会停止解析。