【Sass】小数点以下を切り上げ・切り捨てる方法|math.ceil/floorと桁数指定

Sassでレイアウトを計算するとき、小数点以下を切り上げたり切り捨てたりしたい場面があります。Sassには ceil()(切り上げ)と floor()(切り捨て)がありますが、現在のDart Sassではグローバル版は非推奨で、math.ceil() / math.floor() を使うのが正しい書き方です。この記事では、正しい使い方と負の数での挙動、桁数指定の方法までまとめます。

この記事の結論:切り上げは math.ceil()、切り捨ては math.floor() を使います。先頭で @use "sass:math"; を読み込みます。四捨五入は math.round() です。
スポンサーリンク

切り上げ(math.ceil)と切り捨て(math.floor)

math.ceil() は小数点以下を切り上げて整数にし、math.floor() は切り捨てて整数にします。先頭で sass:math モジュールを読み込んでおきます。

math.ceil / math.floor
@use "sass:math";

.up   { width: math.ceil(3.2); }  // 4(切り上げ)
.down { width: math.floor(3.8); } // 3(切り捨て)
グローバルの ceil() / floor() は非推奨です。モジュールを使わずに ceil(3.2) と書くと、「Global built-in functions are deprecated and will be removed in Dart Sass 3.0.0. Use math.ceil instead.」という警告が出ます。@use "sass:math"; を読み込んで math.ceil() / math.floor() を使ってください。

負の数での挙動に注意

切り上げ・切り捨ては「数直線上で大きい方/小さい方の整数へ動かす」操作です。そのため負の数では直感とずれることがあります。

負の数の切り上げ・切り捨て
@use "sass:math";

.a { x: math.ceil(-3.2); }  // -3(大きい方へ → 0に近づく)
.b { x: math.floor(-3.2); } // -4(小さい方へ → 0から離れる)
「絶対値を切り捨てたい(0方向に丸めたい)」場合は注意が必要です。負の数では math.floor() は0から離れる方向に動きます。符号を取り除きたいだけなら絶対値(math.abs)を使ってから処理します。

小数第N位で切り上げ・切り捨てる

math.ceil() / math.floor() は整数にしか丸められません。「小数第2位まで残して切り上げ」のように桁を指定したい場合は、10のべき乗を掛けて丸め、割って戻すカスタム関数を用意します。

桁数を指定できる切り上げ・切り捨て
@use "sass:math";

@function ceil-to($value, $digits: 0) {
  $factor: math.pow(10, $digits);
  @return math.div(math.ceil($value * $factor), $factor);
}

@function floor-to($value, $digits: 0) {
  $factor: math.pow(10, $digits);
  @return math.div(math.floor($value * $factor), $factor);
}

.a { x: ceil-to(3.14159, 2); }  // 3.15
.b { x: floor-to(3.14159, 2); } // 3.14

round・ceil・floorの違い

関数 動作 3.4 3.6
math.round() 四捨五入 3 4
math.ceil() 切り上げ 4 4
math.floor() 切り捨て 3 3
四捨五入の詳細はround()で四捨五入する方法、割り算(math.div)を使うpx→rem変換はpxからremへ変換する方法で解説しています。

よくある質問(FAQ)

Qceil()やfloor()で非推奨の警告が出ます。
Aグローバルの ceil() / floor() は非推奨(Dart Sass 3.0で削除予定)です。@use "sass:math"; を読み込み、math.ceil() / math.floor() を使ってください。
Qmath.floor(-3.2)が-4になるのはなぜですか?
A切り捨ては「数直線上で小さい方の整数へ動かす」操作だからです。-3.2 より小さい整数は -4 です。0に近づける(0方向に丸める)動きとは異なる点に注意してください。
Q小数第2位まで残して切り上げたいです。
A整数への math.ceil() だけではできません。本文の ceil-to() のように、10のべき乗を掛けて切り上げ、math.div() で割って戻すカスタム関数を使います。
Q四捨五入・切り上げ・切り捨てはどう使い分けますか?
Amath.round() は四捨五入、math.ceil() は常に切り上げ、math.floor() は常に切り捨てです。「足りないと困る」なら切り上げ、「超えると困る」なら切り捨て、というように用途で選びます。

まとめ

Sassで小数点以下を切り上げ・切り捨てるポイントを整理します。

  • 切り上げは math.ceil()、切り捨ては math.floor()
  • グローバル ceil() / floor()非推奨(Dart Sass 3.0で削除予定)
  • 負の数では floor(-3.2)=-4 のように0から離れる方向に動く
  • 桁数指定は math.powmath.div のカスタム関数で
  • 四捨五入は math.round()。用途で使い分ける

関連として、round()で四捨五入数値の絶対値を取得数値から単位を除去もあわせて読むと、Sassの数値処理に強くなれます。