JavaScript: 小数点第何位を指定した四捨五入など

JavaScript: 小数点第何位を指定した四捨五入など

January 20, 2023

JavaScript の四捨五入・切り上げ・切り捨ては Math.round()Math.ceil()Math.floor() です。

これらのメソッドは整数を返すように作られているため、10 の位で丸めたい、小数点第 1 位で丸めたい、といったときは次のようにする必要があります。

console.log(Math.floor(123.456 * 0.01) / 0.01); // 100
console.log(Math.floor(123.456 * 0.1) / 0.1); // 120
console.log(Math.floor(123.456 * 1) / 1); // 123
console.log(Math.floor(123.456 * 10) / 10); // 123.4
console.log(Math.floor(123.456 * 100) / 100); // 123.45

これは次のように関数化することができます。

function floorByBase(value, base) {
  return Math.floor(value * base) / base;
}

floorByBase(123.456, 0.1); // 120
floorByBase(123.456, 10); // 123.4

しかし引数として 0.1 や 10 を渡すのが少々分かりづらいです。

呼び出し側からすると、丸める桁数の位置を渡したくなります。

例えば小数点第 1 位で丸めるならば 1 を、小数点第 2 位で丸めるならば 2 を渡すといった具合です。

これはべき乗(演算子**)を使うことで実現することができます。

// TypeScript で記載しています。

export default class MathUtil {
  /**
   * 任意の桁で四捨五入する。
   */
  public static round(value: number, base: number = 0): number {
    return Math.round(value * 10 ** base) / 10 ** base;
  }

  /**
   * 任意の桁で切り上げする。
   */
  public static ceil(value: number, base: number = 0): number {
    return Math.ceil(value * 10 ** base) / 10 ** base;
  }

  /**
   * 任意の桁で切り捨てする。
   */
  public static floor(value: number, base: number = 0): number {
    return Math.floor(value * 10 ** base) / 10 ** base;
  }
}
console.log(MathUtil.floor(123.456, -2)); // 100
console.log(MathUtil.floor(123.456, -1)); // 120
console.log(MathUtil.floor(123.456, 0)); // 123
console.log(MathUtil.floor(123.456, 1)); // 123.4
console.log(MathUtil.floor(123.456, 2)); // 123.45