3

我有下表与测试数据集:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `desc` varchar(20) DEFAULT NULL,
  `amount` double DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

    insert into `test` (`id`, `desc`, `amount`) values('5',NULL,'847.3');
    insert into `test` (`id`, `desc`, `amount`) values('6',NULL,'-847');
    insert into `test` (`id`, `desc`, `amount`) values('7',NULL,'847.3');
    insert into `test` (`id`, `desc`, `amount`) values('8',NULL,'-847');
    insert into `test` (`id`, `desc`, `amount`) values('9',NULL,'847.4');

所以表格看起来像:

在此处输入图像描述

现在我的问题是当我使用时:

SELECT SUM(amount) FROM test; 

我得到以下结果847.9999999999999而不是预期的848.

有什么想法为什么我不把小数四舍五入?

更新:

我已经在MySQL Server: 5.5.17(windows) 和MySQL Server: 5.5.20Centos上对此进行了测试

4

1 回答 1

7

这是计算机表示浮点数的方式所固有的问题。基本上,一些以 10 为底的值,可以用有限的数字写入,不能以 2 为底表示。

大多数情况下,这种近似值不会被注意到,因为您只显示少量的十进制数字。但是,当您开始将这些近似值相加和相乘时,误差会累积到明显的程度。

这就是该DECIMAL类型存在的原因。它本质上将十进制值表示为整数,除以或乘以 10 的幂。使用这种表示形式,永远不会做出近似值。

于 2013-05-15T12:19:03.533 回答