【検証】FLOAT / DOUBLE / DECIMALの違いとは?SQLで精度の差を比較してみた

はじめに

SQLで数値を扱うとき、「FLOAT」「DOUBLE」「DECIMAL」のどれを使うべきか迷ったことはありませんか?

とくに金額や精密な計算が関わるシステムでは、ちょっとした誤差が大きな問題になることもあります。

この記事では、実際にデータを使ってそれぞれのデータ型を検証しながら、どんな違いがあるのかを初心者の方でも理解できるようにやさしく解説していきます。


各データ型の特徴をざっくり整理

型名特徴精度(おおよそ)よく使われる場面
FLOAT軽くて速いが、精度はあまり高くない約7桁センサーデータ、統計処理など
DOUBLEFLOATより精度が高くて使いやすい約15桁科学計算、グラフ描画など
DECIMAL精度が非常に高い指定どおり金額、税率、金融計算

実験①:数値をそのまま挿入してみる(シンプルな検証)

📌 実験内容

-- テーブル作成
CREATE TABLE tmp_decimal (
  num_float   FLOAT,
  num_double  DOUBLE,
  num_decimal DECIMAL(20,10)
);

-- データ挿入
INSERT INTO tmp_decimal VALUES(
  1111111111.1111111111,
  1111111111.1111111111,
  1111111111.1111111111
);

-- データ取得
SELECT * FROM tmp_decimal;

結果(例)

num_floatnum_doublenum_decimal
11111100001111111111.11111121111111111.1111111111

解説

  • FLOAT: 精度が足りないため、小数点以下が切り捨てられたり、整数部分にも誤差が出る可能性あり。
  • DOUBLE: 小数点以下まである程度保持されるが、後半が丸められる
  • DECIMAL: 指定された精度どおりに完全に格納される。

このように、同じ数値を3種類の型で入れても結果がバラバラになるのがポイントです。


実験②:小数点以下15桁の数を保存してみる

CREATE TABLE tmp_precision (
  num_float   FLOAT,
  num_double  DOUBLE,
  num_decimal DECIMAL(30,20)
);

INSERT INTO tmp_precision VALUES (
  0.123456789012345,
  0.123456789012345,
  0.123456789012345
);

SELECT * FROM tmp_precision;

実行結果(例):

num_floatnum_doublenum_decimal
0.1234570.1234567890123450.12345678901234500000

実験③:非常に大きな数+小数を保存してみる

CREATE TABLE tmp_big_number (
  num_float   FLOAT,
  num_double  DOUBLE,
  num_decimal DECIMAL(38,18)
);

INSERT INTO tmp_big_number VALUES (
  999999999999999.123456789012345678,
  999999999999999.123456789012345678,
  999999999999999.123456789012345678
);

SELECT * FROM tmp_big_number;

実行結果(例):

num_floatnum_doublenum_decimal
1e15999999999999999.1999999999999999.123456789012345678

それぞれの型の使い分けポイント

FLOAT / DOUBLE を使うとよいケース

  • 大量データや高速処理が必要な場合
  • 少しの誤差が許される場合(ゲームやグラフ描画、IoTのセンサーデータなど)

DECIMAL を使うべきケース

  • 金額や税率など、誤差が許されない数値
  • 会計・金融・請求書など、精度が命の処理

まとめ

  • FLOATDOUBLE は高速ですが、精度に制限あり
  • DECIMAL は正確ですが、やや重い
  • 判断の基準は「誤差を許せるか?

金額などの正確さが求められる場面では、迷わず DECIMAL を使いましょう。


おまけ:覚えておくと便利なポイント

よくある用途適した型
センサーの値FLOAT
天気予報の温度DOUBLE
銀行口座の残高DECIMAL
商品の税込価格DECIMAL
位置情報の座標DOUBLE

コメントを送信

You May Have Missed