JavaScriptの数値型はIEEE 754の倍精度浮動小数点型である。整数値と実数が一緒になっているので、厳密に数値を扱おうとするとこれがなかなかに難しい。

値の判定

整数の判定

Number.isInteger() では整数値であるかを判定できる。ただし、これは整数で表現できる を超えても真になることはある。他方 Number.isSafeInteger() では、誤差が生じない整数であるかどうかを判定できる。

浮動小数点数の判定

整数でなければいいので、「数値であり、整数でない」と判定すればよい。

/*
 * @param {any} value
 * @returns {boolean}
 */
function isFloat(value) {
    return typeof value == 'number' && !Number.isInteger(value)
}

NaNの判定

Number.isNaN() または isNaN() が利用できる。isNaN() は数値であることを求めないので、強制型変換によってNaNと判断できる値に対しては真を返す。

isNaN(NaN)                   // true
isNaN(new Date(NaN))         // true
Number.isNaN(NaN)            // true
Number.isNaN(new Date(NaN))  // false

有限数の判定

Number.isFinite() は与えられた数が Infinity, -Infinity, NaNのどれでもないことを判定する。

奇妙な性質

反射律を満たさない

整数型の範囲では を満たすが、JavaScriptの数値型は浮動小数点数のため、NaNを含む。NaNはすべての値と等しくなく、NaNとも等しくないので、反射律を満たさない。したがって、数値の種類を保証せずに単純に同値比較することは思わぬ結果を招く。

NaN == NaN  // false
NaN != NaN  // true
NaN != true // true

値が変わることを期待しない

NaNに対する操作はNaNになるし、Infinityや-Infinityに対する計算結果も値が変わらない可能性がある。x + 1 == x という奇妙なことが成り立つことがあるので、これも値を保証せずに計算結果を期待しないようにする。