Mysql

選擇一個浮點值會產生不正確的結果

  • May 7, 2022

考慮以下。

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)我的專欄來克服這個問題,我只是想知道是什麼導致了這種意外行為。

  • 不要使用FLOATDOUBLE為錢;採用DECIMAL(m,n)
  • 好像qty應該是積分?
  • 以下以及大多數類似的事情都注定要返回 FALSE:
WHERE float_col = 1.23

這是由於FLOAT儲存在二進制中,但是1.23是十進制的。

  • 43616.7 幾乎處於 的範圍限制FLOAT,大約是 7 位有效數字。(該常數是 6 個“有效數字”。)

引用自:https://dba.stackexchange.com/questions/311807