JavaScript おれおれ Advent Calendar 2011 – 7日目

Mathオブジェクトに小数点付きの数値を整数にするメソッドが幾つかあるので、おまけと併せてまとめてみます。

  • Math.trunc()
  • Math.ceil()
  • Math.floor()
  • Math.round()
  • parseInt()
  • ~~n
  • n | 0

Math.trunc()

小数点以下をごっそり切り捨てます。現代ではとりえずこれ使っておけば良いです。

console.log(Math.trunc(3.5));  // => 3
console.log(Math.trunc(-3.5));  // => -3

IE では動きません。

Math.ceil()

与えられた値を下回らない最小の整数、つまり同じか大きい整数を返します。

console.log(Math.ceil(3.5));  // => 4
console.log(Math.ceil(-3.5));  // => -3

ceil (ceiling) は天井の意味。ほらシーリングライトとか。

Math.floor()

与えられた値を上回らない最大の整数、つまり同じか小さい整数を返します。

console.log(Math.floor(3.5));  // => 3
console.log(Math.floor(-3.5));  // => -4

floor は床ですね。

Math.round()

いわゆる四捨五入を行います。

負数の場合の結果は想定外かもしれません。「0.5未満を切り捨てる(0に近づける)」のではなく、「0.5より小さければ小さい整数にする(負の∞に近づける)」という、正負に依らない規則になっています。

console.log(Math.round(3.5));  // => 4
console.log(Math.round(3.49));  // => 3
console.log(Math.round(-3.5));  // => -3
console.log(Math.round(-3.51));  // => -4

parseInt()(だめ)

小数点以下をごっそり切り捨てます。本来は文字列を構文解析 (parse) して整数 (int) へ変換するものです。

console.log(parseInt(3.5));  // => 3
console.log(parseInt(-3.5));  // => -3

基数変換の機能とそれにまつわる罠があります。本来は文字列用であるため内部でいちど数値 1.23 → 数字 "1.23" の変換が行われ、その結果 parseInt(0.0000001) が 1 になったりまた別の罠も。

実数を整数に丸める目的では使用しないでください。

~~n(やめて)

ビット演算をやるとき整数化される仕様を利用します。普通に NOT する ~n と符号が逆になるのでもう一度やる ~~n 感じです。

console.log(~~3.5);  // => 3
console.log(~~-3.5);  // => -3

~~NaN が 0 になったり ~~Number.MAX_SAFE_INTEGER が -1 になったりするのでアレです。そもそも読みづらいです。

実数を整数に丸める目的では使用しないでください。

n | 0(やめろ)

同じくビット演算を利用します。

console.log(3.5 | 0);  // => 3
console.log(-3.5 | 0);  // => -3

~~n と同じような問題があります。

実数を整数に丸める目的では使用しないでください。

更新履歴

  • 2022-01-08
    • Math.trunc() を追加
    • parseInt() 利用上の注意を追加
    • ~~n と n | 0 を追加
    • なんかちょっと注目されてるっぽいので……
    • 結果的に正解が 4 パターンになったのでタイトルそのまま
  • 2011-12-07
    • 公開