JavaScript 逆引き集 | 数値の丸め(Math)

JavaScript JavaScript
スポンサーリンク

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系で。
タイトルとURLをコピーしました