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

javascrpit JavaScript
スポンサーリンク

toFixed() の仕組みを理解したら、「誤差ゼロで小数計算ができるライブラリ」 を使う方法を知っておくと、実務で格段に安心して扱えます。

ここでは、初心者にも扱いやすい代表的な 3 つを紹介します。

1. Big.js(軽量で信頼性の高い定番)

特徴

  • JavaScript 標準の浮動小数点誤差を完全に回避
  • 四則演算(+ − × ÷)をすべて正確に扱える
  • ファイルサイズが小さく、金融・通貨計算などに最適

使い方(例)

<script src="https://cdn.jsdelivr.net/npm/big.js@6.2.1/big.min.js"></script>
<script>
  const a = new Big(0.1);
  const b = new Big(0.2);
  const sum = a.plus(b);
  console.log(sum.toString()); // "0.3" (誤差なし!)

  // 小数桁を指定して出力
  console.log(sum.toFixed(2)); // "0.30"
</script>
HTML

普通の 0.1 + 0.20.30000000000000004 になりますが、Big.js なら正確に 0.3

2. Decimal.js(より多機能な高精度ライブラリ)

特徴

  • Big.js よりも高機能(指数表記、丸めモード、比較演算など)
  • 通貨・科学計算などでも使われる
  • Node.js / ブラウザ両対応

使い方(例)

<script src="https://cdn.jsdelivr.net/npm/decimal.js@10.4.3/decimal.min.js"></script>
<script>
  const x = new Decimal(1.005);
  console.log(x.toFixed(2)); // "1.01" ← ちゃんと丸められる!

  // 計算
  const result = new Decimal(0.1).plus(0.2).times(3);
  console.log(result.toString()); // "0.9"

  // 丸めモード設定(四捨五入・切り上げ・切り捨てなど)
  Decimal.set({ rounding: Decimal.ROUND_HALF_UP });
</script>
HTML

Decimal.jsBig.js より少し重いですが、丸め方式を自由に変えられる点が強力。

3. Dinero.js(通貨・金額計算に特化)

特徴

  • 金額の丸め誤差を防ぐ「整数ベース」の通貨計算ライブラリ
  • 通貨単位(JPY, USD など)やフォーマットも管理できる
  • 金融アプリ・ECサイト・会計システムなどで便利

使い方(例)

<script type="module">
  import { dinero, add, subtract, multiply, divide, toUnit } from 'https://cdn.jsdelivr.net/npm/dinero.js@2.0.0-rc.9/+esm';
  import { USD } from '@dinero.js/currencies';

  const price = dinero({ amount: 1999, currency: USD }); // $19.99(内部的には整数1999¢)
  const tax = multiply(price, 0.1); // 10% 税金
  const total = add(price, tax);

  console.log(toUnit(total)); // → 21.99(正確な計算結果)
</script>
HTML

Dinero.js は「金額 = セント単位の整数」として管理するので、誤差が物理的に発生しません。

⚖️ どれを使えばいいの?

用途おすすめ理由
軽量・簡単に誤差なし計算をしたいBig.jsシンプル&信頼性高
科学計算・複雑な丸め制御が必要Decimal.js丸めモードや指数対応
金額・通貨の正確な取り扱いDinero.jsセント単位で誤差ゼロ

参考:自作の「安全 toFixed」

もしライブラリを使わず「とりあえず誤差を減らしたい」ときは、以下のようなユーティリティ関数を使えます。

function safeToFixed(num, digits = 2) {
  const factor = 10 ** digits;
  return (Math.round((num + Number.EPSILON) * factor) / factor).toFixed(digits);
}

console.log(safeToFixed(1.005, 2)); // "1.01"
console.log(safeToFixed(0.1 + 0.2, 2)); // "0.30"
JavaScript

まとめ

シーン解決策
表示用の桁そろえtoFixed()
誤差のない計算Big.js / Decimal.js
通貨計算Dinero.js
手軽に誤差軽減safeToFixed() 関数

誤差が出る・出ない仕組みの可視化図

タイトルとURLをコピーしました