考虑以下。
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:
这是由于
FLOAT
存储在二进制中,但是1.23
是十进制的。43616.7 几乎处于 的范围限制
FLOAT
,大约是 7 位有效数字。(该常数是 6 个“有效数字”。)