Mysql
選擇一個浮點值會產生不正確的結果
考慮以下。
CREATE TABLE IF NOT EXISTS `docs` ( `id` int(6) unsigned NOT NULL, `qty` float NOT NULL, `price` float NOT NULL, `rebate` float not null, PRIMARY KEY (`id`) ) DEFAULT CHARSET=utf8; INSERT INTO `docs` VALUES (1,1,43616.7,0); SELECT SUM(qty * (price - price * rebate/100)) AS endval FROM docs
此查詢沒有按預期返回 43616.7,而是返回 43616.69921875(在某些機器上為 43616.671875)。展示小提琴可以在這裡找到。
為什麼會這樣?我希望它能夠像這樣工作(為實際輸入像這樣基本的東西道歉):
1 * (43616.7 - 43616.7 * 0 / 100) = 1 * (43616.7 - 0) = 43616.7
我意識到我可以通過使用
decimal (10,2)
我的專欄來克服這個問題,我只是想知道是什麼導致了這種意外行為。
- 不要使用
FLOAT
或DOUBLE
為錢;採用DECIMAL(m,n)
- 好像
qty
應該是積分?- 以下以及大多數類似的事情都注定要返回 FALSE:
WHERE float_col = 1.23
這是由於
FLOAT
儲存在二進制中,但是1.23
是十進制的。
- 43616.7 幾乎處於 的範圍限制
FLOAT
,大約是 7 位有效數字。(該常數是 6 個“有效數字”。)