把數字轉換成整數的方法
-
- 方法一:Math函數
-
- 1.Math.floor()将其參數轉換成小于且最接近它的整數(下取整)。
- 2.Math.ceil()将其參數轉換成大于且最接近它的整數(上取整)。
- 3.Math.round()将其參數轉換成最接近它的整數。
- 方法二:通過定制函數ToInteger()得到函數(JavaScript不一定支援)(ECMAScript内置ToInteger()方法,該方法會移除浮點數的小數部分)
- 方法三:通過位運算符得到32位整數
-
- 1.二進制或Or(|)
- 方法四:通過全局函數parseInt()得到整數
)
方法一: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()對于解析字元串非常有用,但是必須注意函數在遇到第一個非法字元時會停止解析。