情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

ECMAScript 6の新機能(2)数値関連関数

2016/05/27

改良

ECMAScript 5では下の4つの数値関連関数はグローバル関数として提供されていました。

  • isFinite
  • isNaN
  • parseFloat
  • parseInt

ECMAScript 6で上の4つの関数と同名の、ほぼ同じ動作をする関数がNumberクラスに追加されました。

Number.isFinite

ECMAScript 5で提供されていたisFinite関数は数値がInfinity-InfinityNaNの何れでもないかチェックする関数でした。

ただし、数値以外に対してはチェックを行う前に数値への変換を試みます。

C:\work\node>node
> isFinite(1)
true
> isFinite(Infinity)
false
> isFinite(-Infinity)
false
> isFinite(NaN)
false
> isFinite('1')
true
> isFinite('kaa')
false

ECMAScript 6で追加されたNumber.isFinite関数も数値がInfinity-InfinityNaNの何れでもないかチェックする関数です。

ただし、数値以外に対してチェックを行う前に数値への変換は試みません。結果として、数値以外に対しては必ずfalseが返ります。

この点はisFinite関数と動作が異なりますので注意してください。

> Number.isFinite(1)
true
> Number.isFinite(Infinity)
false
> Number.isFinite(-Infinity)
false
> Number.isFinite(NaN)
false
> Number.isFinite('1')
false
> Number.isFinite('kaa')
false

Number.isNaN

ECMAScript 5で提供されていたisNaN関数は数値がNaNであるかチェックする関数でした。

ただし、数値以外に対してはチェックを行う前に数値への変換を試みます。

> isNaN(NaN)
true
> isNaN(1)
false
> isNaN('1')
false
> isNaN('a')
true

このように、文字列の1は数値の1に変換されるため結果はfalseとなり、文字列のaは数値のNaNに変換されるため結果はtrueとなります。


ECMAScript 6で追加されたNumber.isNaN関数も数値がNaNであるかチェックする関数です。

ただし、数値以外に対してチェックを行う前に数値への変換は試みません。結果として、数値以外に対しては必ずfalseが返ります。

この点はisNaN関数と動作が異なりますので注意してください。

> Number.isNaN(NaN)
true
> Number.isNaN(1)
false
> Number.isNaN('1')
false
> Number.isNaN('a')
false

このように、文字列の1aは数値でないため結果はfalseとなります。

Number.parseFloat及びNumber.parseInt

ECMAScript 5で提供されていたparseFloat関数やparseInt関数は文字列を数値(小数や整数)に変換する関数でした。

> parseFloat('3')
3
> parseFloat('3.14')
3.14
> parseFloat('314e-2')
3.14
> parseFloat('.0314E+2')
3.14
> parseFloat('3.14 is pai')
3.14
> parseFloat('pai = 3.14')
NaN
> parseInt('3')
3
> parseInt('3.14')
3
> parseInt('314e-2')
314
> parseInt('.0314E+2')
NaN
> parseInt('3.14 is pai')
3
> parseInt('pai = 3.14')
NaN

ECMAScript 6で追加されたNumber.parseFloat関数やNumber.parseInt関数も文字列を数値(小数や整数)に変換する関数です。

これらはparseFloat関数やparseInt関数と全く同じ動作をします。

> Number.parseFloat('3')
3
> Number.parseFloat('3.14')
3.14
> Number.parseFloat('314e-2')
3.14
> Number.parseFloat('.0314E+2')
3.14
> Number.parseFloat('3.14 is pai')
3.14
> Number.parseFloat('pai = 3.14')
NaN
> Number.parseInt('3')
3
> Number.parseInt('3.14')
3
> Number.parseInt('314e-2')
314
> Number.parseInt('.0314E+2')
NaN
> Number.parseInt('3.14 is pai')
3
> Number.parseInt('pai = 3.14')
NaN

新規追加

ECMAScript 6で新しい数値関連関数や値が幾つか追加されました。

Number.isInteger

これは数値が整数であるかチェックする関数です。

> Number.isInteger(1)
true
> Number.isInteger(1.1)
false
> Number.isInteger('1')
false
> Number.isInteger('a')
false
> Number.isInteger(NaN)
false
> Number.isInteger(Infinity)
false
> Number.isInteger(-Infinity)
false

安全な整数

ECMAScriptには安全な整数とか安全でない整数という概念があります。

これはECMAScriptの数値はたとえ整数であっても全て内部的には浮動小数点数として表されているため整数が正しく表せる範囲には限界があるということです。

これはECMAScriptの処理系で9007199254740993などの値を評価してみれば端的に分かります。

> 9007199254740993
9007199254740992

!?

なんということでしょう。9007199254740993を評価したはずが、評価結果は9007199254740992という1だけ小さい値となりました。

これが「安全でない」という概念の意味するところです(逆に「安全」という概念は値と値の評価結果の間に差異がないということを意味します)。

そして、ECMAScript 6でNumber.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGERが追加されました。

この2つの値で安全な整数の範囲を表します。この範囲内の整数は全て安全な整数です。

> Number.MIN_SAFE_INTEGER
-9007199254740991
> Number.MAX_SAFE_INTEGER
9007199254740991

また、Number.isSafeInteger関数が追加されました。

これは数値がNumber.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGERの範囲内の整数であるかチェックする関数です。

安全な整数であるかチェックする関数ではないことに注意してください。

> 9007199254740991
9007199254740991
> 9007199254740992
9007199254740992
> 9007199254740993
9007199254740992
> 9007199254740994
9007199254740994
> Number.isSafeInteger(9007199254740991)
true
> Number.isSafeInteger(9007199254740992)
false
> Number.isSafeInteger(9007199254740993)
false
> Number.isSafeInteger(9007199254740994)
false
> Number.isSafeInteger('1')
false
> Number.isSafeInteger(3.14)
false

誤差

ECMAScriptの数値は全て内部的には浮動小数点数として表されているため数値の計算を行うと誤差が発生することがあります。

> 0.1 + 0.2
0.30000000000000004
> 0.1 + 0.2 === 0.3
false

ECMAScript 6でNumber.EPSILONが追加されました。

これは一般的な誤差の範囲を表します。

> Number.EPSILON
2.220446049250313e-16
> 0.1 + 0.2 > 0.3 - Number.EPSILON && 0.1 + 0.2 < 0.3 + Number.EPSILON
true
pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-ecmascript 2015, ecmascript 6, Javascript