2013-05-15 163 views
2

我已經與測試數據集如下表:Mysql的SUM函數返回返回錯誤的十進制值

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'); 

所以表如下所示:

enter image description here

現在我的問題是,當我用:

SELECT SUM(amount) FROM test; 

我得到以下結果847.9999999999999而不是預期的848

任何想法,爲什麼我沒有得到小數圓整?

更新:

我對MySQL Server: 5.5.17(Windows)和MySQL Server: 5.5.20 Centos的

+1

對我來說結果是848 –

+4

使用'decimal'類型而不是'double'這是浮點數,因此帶有固有的不精確性; http://stackoverflow.com/questions/6831217/double-vs-decimal-in-mysql –

+0

我建議你使用DECIMAL類型,而不是DOUBLE – fthiella

回答

5

這是由計算機爲代表固有的方式floating-point numbers一個問題測試這一點。基本上,基數爲10的某些數值可以用有限數量的數字表示,不能用數字2表示。

大多數情況下,這些近似值不被注意,因爲您只顯示少量的小數位。但是當你開始增加和乘以這些近似值時,誤差會累積到一個明顯的位置。

這就是爲什麼DECIMAL類型存在。它本質上表示一個十進制值,它是一個整數,除以或乘以10的冪。有了這樣的表示,就不會有近似值。