首頁 > web前端 > js教程 > 在JavaScript中判斷整數的N種方法範例介紹_javascript技巧

在JavaScript中判斷整數的N種方法範例介紹_javascript技巧

WBOY
發布: 2016-05-16 16:43:53
原創
1167 人瀏覽過

整數型別(Integer)在JavaScript常會導致一些奇怪的問題。在ECMAScript的規範中,他們只存在於概念中:

所有的數字都是浮點數,整數只是沒有一組沒有小數的數字。

在這篇部落格中,我會解釋如何去檢查某個值是否為整數。
ECMAScript 5

在ES5中有很多方法你可以使用。有時侯,你可能會想用自己的方法:一個isInteger(x)的函數,如果是整數回傳true,否則回傳false.

讓我們來看看一些例子。

透過餘數檢查

你可以用餘數運算(%),將一個數字以1求餘,看看餘數是不是0。

function isInteger(x) {
  return x % 1 === 0;
}
登入後複製

我喜歡這個方法,因為它非常簡單,而且有效。

> isInteger(17)
true
> isInteger(17.13)
false
登入後複製
登入後複製

在操作餘數運算時你得小心一點,因為結果取決於第一個數的符號,如果是正的,結果就是正的;否則就是負的。

> 3.5 % 1
0.5
> -3.5 % 1
-0.5
登入後複製

然後,我們也可以檢查0,這其實不是一個問題。但問題是:這個方法對非數字也會回傳true,因為 % 會將它轉換成數字:

> isInteger('')
true
> isInteger('33')
true
> isInteger(false)
true
> isInteger(true)
true
登入後複製

可以透過很簡單的型別檢查來解決:

function isInteger(x) {
  return (typeof x === 'number') && (x % 1 === 0);
}
登入後複製

透過Math.round() 如果一個數字取整以後還跟之前的值一樣,那麼它就是整數。在JavaScript中可以透過Math.round()來檢查:

function isInteger(x) {
  return Math.round(x) === x;
}
登入後複製

這個方法也不錯

> isInteger(17)
true
> isInteger(17.13)
false
登入後複製
登入後複製

它也可以判斷非數字,因為Math.round()總是回傳數字,且===只有當型別一樣時才回傳true.

> isInteger('')
false
登入後複製

如果你想讓程式碼更清楚一點,你可以加入類型檢查(就是我們在之前版本做的)。另外,Math.floor()和Math.ceil()可以像Math.round()一樣運作。 透過位元操作檢查 位元操作符提供另外一種「取整」的方法:

function isInteger(x) {
  return (x | 0) === x;
}
登入後複製

這個解(跟其它位運算一樣)有一個缺陷:它無法處理超過32位的數字。

> isInteger(Math.pow(2, 32))
false
登入後複製

透過parseInt()檢查 parseInt()也提供了跟Math.round()類似將數字轉換成整數的方法。 讓我們看看這個方法為什麼好。

function isInteger(x) {
  return parseInt(x, 10) === x;
}
登入後複製

像Math.round()解一樣,它也可以處理非數字的情況,但是它也不能正確地處理所有的整數數字:

> isInteger(1000000000000000000000)
false
登入後複製

為什麼? parseInt()在解析整數之前強迫將第一個參數解析成字串。因此使用這種方法將數字轉換成整數不是一個好的選擇。

> parseInt(1000000000000000000000, 10)
1
> String(1000000000000000000000)
'1e+21'
登入後複製

就像上面那樣,parseInt()在解析'1e 21'時在1處停止處理了,所以它才會返回1. ECMAScript 6 對於Math.round()扔補充,ES6提供了另外一個將數字轉換成整數的方法:Math.trunc()。此函數會移除數字的小數部分。

> Math.trunc(4.1)
4
> Math.trunc(4.9)
4
> Math.trunc(-4.1)
-4
> Math.trunc(-4.9)
-4
登入後複製

此外,ECMAScript6不需要去處理檢查整數那些瑣碎的任務,因為它附帶一個內建函數 Number.isInteger()。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板