天天看點

轉換成整數的方法

把數字轉換成整數的方法

    • 方法一: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()對于解析字元串非常有用,但是必須注意函數在遇到第一個非法字元時會停止解析。

繼續閱讀