SlideShare a Scribd company logo
SQLアンチパターン読書会 09章 ラウンディングエラー
 9.1 目的
 9.2 アンチパターン
 9.5 解決策
 9.3 アンチパターンの見つけ方
 9.4 アンチパターンを用いてもよい場合
 まとめ
 SQLで、小数点を用いた計算を正しく行いたい。
 浮動小数点型であるFLOAT型を使用する。
 小数点型を扱う上で、2つ問題がある。
◦ ①無限桁が必要な実数の存在。
◦ ②10進数から2進数への変換。
 実数の中には、無限桁となる数が存在する。
◦ 循環小数(有利数): 1/3 = 0.3333…
◦ 代数的無理数: √2 = 1.41421356…
◦ 超越数: π = 3.141592…
 無限桁の入力は不可能で、多くの場合不要。
 入力された有限精度の値が正確なら、それでよい
だろう。
 FLOAT型は2進数形式(IEEE754)。
 有限精度の10進数を、2進数に変換すると無限精
度が必要になることがある。
◦ 10進数: 59.95
◦ ->2進数: 111011.11110011001100110011…
◦ ->10進数: 59.950000762939
 つまり、有限精度の正確性すら保証できない。
 計算値が不正確。
計算式 FLOAT4
型使用
SELECT n * 1 FROM t;
(n=59.95の場合)
59.9500007629395
SELECT SUM(n * 1) FROM t;
(n=59.95 * 10件の場合)
599.500007629395
SELECT POWER(n, 10) FROM t;
(n=0.1の場合)
1.00000014901162
e-010
 等価性比較で予期しない結果となる。
検索条件 FLOAT4
型使用
SELECT n * 1 FROM t
WHERE
n = 59.95;
該当なし
SELECT n * 1 FROM t
WHERE
n = 59.9500007629395;
該当なし
SELECT n * 1 FROM t
WHERE
ABS(n - 59.95) < 0.000001;
59.9500007629395
 任意精度の小数型=NUMERIC or DECIMALを使う。
 指定の精度・スケール内なら、正確に値を格納で
きる。
CREATE tbl(col NUMERIC(10, 3));
1234567.123
スケー
ル
精度
 計算値が正確な値になる。
計算式 FLOAT4
型使用
NUMERIC(4, 2)
型使用
SELECT n * 1 FROM t;
(n=59.95の場合)
59.9500007629395 59.95
SELECT SUM(n * 1) FROM t;
(n=59.95 * 10件の場合)
599.500007629395 599.5
SELECT POWER(n, 10) FROM t;
(n=0.1の場合)
1.00000014901162
e-010
1.000000
e-010
 予期通りの結果となる。
検索条件 FLOAT4
型使用
NUMERIC(4, 2)
型使用
SELECT n * 1 FROM t
WHERE
n = 59.95;
該当なし 59.95
SELECT n * 1 FROM t
WHERE
n = 59.9500007629395;
該当なし 該当なし
SELECT n * 1 FROM t
WHERE
ABS(n - 59.95) < 0.000001;
59.9500007629395 59.95
RDBMS 浮動小数点型 任意精度の小数点型
Oracle BINARY_FLOAT,
BINARY_DOUBLE
NUMBER, NUMERIC,
DECIMAL, FLOAT, REAL,
DOUBLE PRECISION
SQL Server FLOAT, REAL,
DOUBLE PRECISION
?
DB2 FLOAT, REAL,
DOUBLE
NUMERIC, DECIMAL,
NUM, DEC
PostgreSQL FLOAT, REAL,
DOUBLE PRECISION
NUMERIC, DECIMAL
MySQL FLOAT, REAL, DOUBLE
DOUBLE PRECISION
NUMERIC, DECIMAL,
DEC
 浮動小数点型を使用している。
◦ FLOAT、REAL、DOUBLE PRECISION型
 INTEGERやNUMERIC型より広範囲の実数を扱う
必要がある場合
◦ 例) 科学技術計算のアプリケーション
 結局、無限精度の値を格納できない。
 訳注の意図は?
 科学技術計算ではもっと厳しい要件もあるので
は?
◦ 有理数型
◦ 科学計算でいうところの有効桁数
 FLOAT型は原則使わない。
◦ 有限桁の実数すら正確に格納できないことがある。
 NUMERIC、DECIMAL型を使う。

More Related Content

PPTX
超LINQ入門
PDF
C++ template-primer
PDF
Javaセキュアコーディングセミナー東京第2回講義
PDF
Numeric クラスについて
PDF
Clojure
PDF
Scalaで萌える関数型プログラミング[1.1.RC1]
PDF
NLP若手の回 ACL2012参加報告
PDF
Define and expansion of cpp macro
超LINQ入門
C++ template-primer
Javaセキュアコーディングセミナー東京第2回講義
Numeric クラスについて
Clojure
Scalaで萌える関数型プログラミング[1.1.RC1]
NLP若手の回 ACL2012参加報告
Define and expansion of cpp macro

Viewers also liked (10)

PDF
アジャイルサムライ 5章「具現化させる」
PDF
SQLアンチパターン読書会 レジュメ
PPTX
SQLアンチパターンNight ライトニングトーク
PDF
DBスキーマもバージョン管理したい!
PDF
HerokuではじめるRailsプログラミング入門 6-3節「複数モデルの連携」
PDF
SQLアンチパターン読書会 「スパゲッティクエリ」
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PPTX
SQLアンチパターンNight
PDF
SQLアンチパターン「ディプロマティック・イミュニティ」
PDF
MySQLで論理削除と正しく付き合う方法
アジャイルサムライ 5章「具現化させる」
SQLアンチパターン読書会 レジュメ
SQLアンチパターンNight ライトニングトーク
DBスキーマもバージョン管理したい!
HerokuではじめるRailsプログラミング入門 6-3節「複数モデルの連携」
SQLアンチパターン読書会 「スパゲッティクエリ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターンNight
SQLアンチパターン「ディプロマティック・イミュニティ」
MySQLで論理削除と正しく付き合う方法
Ad

SQLアンチパターン読書会 09章 ラウンディングエラー