JavaScript | 数値を固定小数点数形式で文字列に変換(toFixed() メソッド)

javascrpit JavaScript
スポンサーリンク

では、toFixed() の「浮動小数点誤差による丸めミス」をできるだけ防ぐ、
安全なユーティリティ関数 safeToFixed() を紹介します。

safeToFixed() — 安全な固定小数点フォーマット関数

コード例

/**
 * 浮動小数点誤差を補正して安全に固定小数点文字列を返す関数
 * @param {number} num - 対象の数値
 * @param {number} decimals - 小数点以下の桁数(0~100)
 * @returns {string} 固定小数点形式の文字列(例: "1.01")
 */
function safeToFixed(num, decimals = 2) {
  const factor = 10 ** decimals;
  // 誤差を吸収するために Number.EPSILON を加算
  const rounded = Math.round((num + Number.EPSILON) * factor) / factor;
  // 通常の toFixed でゼロ埋めして文字列化
  return rounded.toFixed(decimals);
}
JavaScript

動作テスト

console.log(safeToFixed(1.005, 2));  // "1.01" ✅
console.log(safeToFixed(0.615, 2));  // "0.62" ✅
console.log(safeToFixed(1.2345, 3)); // "1.235"
console.log(safeToFixed(728.52, 5)); // "728.52000"
console.log(safeToFixed(48, 2));     // "48.00"
JavaScript

ポイント解説

処理役割
10 ** decimals小数を整数に変換して丸めるための倍率
num + Number.EPSILON二進浮動小数点誤差を補正する小さな値(約 2.22e-16)を加える
Math.round(...) / factor指定桁数で丸め直す
.toFixed(decimals)文字列化&ゼロ埋め( "1.2""1.20" など)

注意点

  • 完璧ではありません。 きわめて大きな数値や、極端に小さい桁数(例:1e-10レベル)では誤差が残ることもあります。
  • 金額など正確な10進演算が必須な場合は、decimal.js / big.js のような 十進演算ライブラリを使うのが最も確実です。

See the Pen safeToFixed() vs toFixed() Comparison Demo by MONO365 -Color your days- (@monoqlo365) on CodePen.

このデモでは:

  • 数値と小数点以下の桁数を入力
  • toFixed()safeToFixed() の結果をリアルタイムで比較表示
  • 浮動小数点誤差が出る例(例:1.005)も分かりやすく確認
  • わかりやすいUI(自動更新・ゼロ埋め付き)
タイトルとURLをコピーしました