JavaScript数値の丸め(Math.round / Math.ceil / Math.floor)
丸めは「端数をどう扱うか」を決める操作。表示や料金計算、ページネーションなどで頻出です。まずは3つの基本を押さえれば、ほとんどの場面に対応できます。
3種類の基本動作
Math.round(x) // 四捨五入(0.5以上は切り上げ、未満は切り捨て)
Math.ceil(x) // 切り上げ(常に上方向へ)
Math.floor(x) // 切り捨て(常に下方向へ)
JavaScript- round: 0.5を境に四捨五入。負の数でも「0.5の境目は上方向(+∞側)」へ寄る挙動になります。
- ceil: 常に「大きいほう」へ。負の数は値が小さくなる方向に寄ります(例: -3.1 → -3)。
- floor: 常に「小さいほう」へ。負の数は値がより小さい整数へ(例: -3.9 → -4)。
基本のコード例
console.log(Math.round(3.4)); // 3
console.log(Math.round(3.5)); // 4
console.log(Math.round(-3.5)); // -3
console.log(Math.ceil(3.1)); // 4
console.log(Math.ceil(-3.1)); // -3
console.log(Math.floor(3.9)); // 3
console.log(Math.floor(-3.9)); // -4
JavaScript- ポイント: 負の数は直感と逆に感じることがあるため、挙動を確認しておくと安心です。
小数点以下の桁で丸めたい(n桁指定)
「小数点以下n桁で四捨五入・切り上げ・切り捨て」したい場合は、スケーリング(10のべき乗で掛けて戻す)を使います。
// 四捨五入(小数点以下n桁)
function roundTo(x, n = 0) {
const f = 10 ** n;
return Math.round(x * f) / f;
}
// 切り上げ(小数点以下n桁)
function ceilTo(x, n = 0) {
const f = 10 ** n;
return Math.ceil(x * f) / f;
}
// 切り捨て(小数点以下n桁)
function floorTo(x, n = 0) {
const f = 10 ** n;
return Math.floor(x * f) / f;
}
console.log(roundTo(3.14159, 2)); // 3.14
console.log(ceilTo(3.14101, 2)); // 3.15
console.log(floorTo(3.14999, 2)); // 3.14
JavaScript- ポイント: 浮動小数点の誤差で期待と微妙にズレることがあるため、表示だけなら toFixed も選択肢。
よくある用途とテンプレート
金額・合計の計算(最終的に整数円へ丸め)
const subtotal = 1234.56;
const taxRate = 0.1;
const total = Math.round(subtotal * (1 + taxRate)); // 1235(円)
JavaScript- ポイント: 表示は toLocaleString、計算は整数へ丸めてから進めると誤差に強い。
パーセンテージ表示(1桁に丸め)
const ratio = 0.12345;
const pct = `${roundTo(ratio * 100, 1)}%`; // "12.3%"
JavaScript- ポイント: 計算→round→文字列化の順に。
ページ数や個数の上方向調整(ceil)
const items = 101;
const perPage = 20;
const pages = Math.ceil(items / perPage); // 6(最後のページに余りがあっても切り上げ)
JavaScript- ポイント: 「足りない分をもう1ページ」にしたい場面でceil。
タイムスタンプの秒切り捨て(floor)
const nowMs = Date.now(); // ミリ秒
const sec = Math.floor(nowMs / 1000); // 秒へ
JavaScript- ポイント: 下方向へ丸めて「境界未満」を含めないときにfloor。
落とし穴とミニ対策
- 浮動小数点の誤差: 1.005を2桁に丸めるなどで意図とズレることがある。
- 対策: 可能なら整数スケール(例: 金額は「小数なしの最小単位」で保持)、表示専用なら toFixed を使う。
- 負の数の直観違い: ceil/floorの結果が想像しづらい。
- 対策: 「ceilは上方向」「floorは下方向」の軸で覚える(負数は符号の影響で見かけが変わる)。
- 表示と計算の混同: toFixedは文字列を返す。
- 対策: 計算はMath系で、表示はtoFixedやtoLocaleStringで分ける。
練習問題(手を動かす)
- 四捨五入で2桁へ
console.log(roundTo(1.005, 2)); // 期待は1.01(誤差に注意)
JavaScript- ページ数を計算(切り上げ)
console.log(Math.ceil(53 / 10)); // 6
JavaScript- 距離の切り捨て(小数1桁)
console.log(floorTo(12.99, 1)); // 12.9
JavaScript直感的な指針
- 四捨五入: Math.round。
- 常に上へ: Math.ceil。
- 常に下へ: Math.floor。
- n桁指定: 掛けて丸めて割る(10のべき乗でスケール)。
- 表示専用: toFixed、計算はMath系で。
