LoginSignup
7
6

More than 3 years have passed since last update.

javascript int変換/キャスト/切り上げ/切り捨て/四捨五入-注意点

Last updated at Posted at 2020-03-28

はじめに

あれ?javascriptにキャスト演算子てなかったけ?四捨五入てどうやってやるんや?てなった人向けの備忘録てきな記事です。intに変換する際の注意点、例もあわせてどうぞ!

parseInt($hoge, 10)

これがほかの言語でいう (int)的なキャストのメソッドですね。
実数値を持つ変数$hogeに対してparseInt($hoge, 10)のように使います。
ここで第2引数は第1引数の基数(10進数や2進数の10や2のこと)で省略可能ですがデフォルトが10ではなく入力値によって勝手にその基数は判断されるので第2引数まで与えるのが無難です。

parseInt()
parseInt(2.5, 10)
parseInt(2.5)
parseInt("2.5")
parseInt(10, 2)

parseInt(-2.5)

上の例では最初の4つがすべて2を返し、最後の1つは-2を返します。

Number($hoge)

はい、これが僕がずっと勘違いしていたものでこれがいわゆる(int)的なキャストをする関数だと思ってました。javascriptにはこういうキャスト演算子はないんだーってなって一番名前的に近そうなこれがintへのキャストだと皆さん勘違いすると思います。僕だけですかね。はい全く違いました。結論から言えばこれはStringなどの方から数値(小数含む)型への型変換のメソッドでした。

これはそもそも関数ではなくNumberオブジェクトを生成するコンストラクタで、このコンストラクタの引数に値を与えることでその値がNumberオブジェクトになります。基本的にjavascriptではこのNumber型で算術演算を行うためこのコンストラクタが結局キャストのようになるわけです。

これはNumberプリミティブ値(String, boolなどのメソッドを持たない基本のデータ型)を生成する関数でした。従ってこの関数は文字列などから数値への変換を行う型変換の関数でした。単純にNumberオブジェクトを生成したい場合はnew Number($hoge)で初期化する必要がありますね。また上で記したparseInt()もこのNumberオブジェクトのメソッドです。

以下に例を示します。

Number()
Number('123')     // 123
Number('12.3')    // 12.3
Number('123e-1')  // 12.3
Number('')        // 0
Number(null)      // 0
Number('0x11')    // 17
Number('foo')     // NaN

また + 演算子でも number への変換が簡単に行えるようです。

+
+'123'     // 123
+'12.3'    // 12.3
+'123e-1'  // 12.3
+''        // 0
+null      // 0
+'0x11'    // 17
+'foo'     // NaN

Math.floor($hoge)

与えられた数値の切り捨て(与えられた数値と等しい整数、もしくは与えられた数値より小さい最大の整数を返す)を行う関数です。

これも注意が必要で、一瞬、parseInt($hoge)=Math.floor($hoge)と思いませんか?ぼくは思いました。
でも違いますね。上のparseInt()の例と下の例を見比べて貰えばわかりますが、細かい精度の違いは置いておくと

parseInt($hoge) = $hoge >= 0 ? Math.floor($hoge) : Math.ceil($hoge)

となるわけです。Math.floor()などの関数を使う場合は与えられた数値が負の場合もしっかり考慮して関数を選ぶ必要がありますね。
ちなみに正確にMath.floor()はparseInt()に比べて引数にStringをとらない、parseInt()はとても大きい引数や小さい引数にたして予期しない結果を生む可能性があるのでMath.floorの代替としてはつかうべきでない、などの違いがあります。

Math.floor()
Math.floor( 2.5); //  2
Math.floor(-2.5); // -3

Math.ceil($hoge)

与えられた数値の切り上げ(与えられた数値と等しい整数、もしくは与えられた数値より大きい最小の整数を返す)の関数です。
これについての注意点などはMath.floorと同様なので割愛。

Math.ceil()
Math.ceil(.95);    // 1
Math.ceil(4);      // 4
Math.ceil(7.004);  // 8
Math.ceil(-0.95);  // -0

Math.round($hoge)

皆さんお待ちかね、四捨五入の関数ですね。

Math.round()
Math.round( 20.49); //  20
Math.round( 20.5 ); //  21
Math.round( 42   ); //  42
Math.round(-20.5 ); // -20

おわりに

以上業務システムの開発を行っている際によく用いる数値計算の関数などでした。
金銭の計算など値の誤差が許されない状況でこれらの関数の使い分けは非常に重要になってきます。
日頃からそれぞれの関数のポイントを頭に入れて実装をしておくと良いですね!

7
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6