では、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(自動更新・ゼロ埋め付き)
