2015-05-25 230 views
11

我有以下SQL查詢。SUM中出現不正確的小數位MySQL

SELECT SUM(final_insurance_total) as total 
FROM `leads` 
GROUP BY leads.status 

我有數據的領先表中的單個行與用於458796. final_insurance_total一個值final_insurance_total數據類型是float

由於某些原因,MySQL正在將單個行相加爲「458796.375」。

如果我更改查詢到

SELECT (final_insurance_total) as total 
FROM `leads` 
GROUP BY leads.status 

返回正確的值。世界正在發生什麼?

+0

http://bugs.mysql.com/bug.php?id=1961 –

+0

同樣的問題在這裏http://stackoverflow.com/questions/3907021/using-sum-on-float-data –

+3

這是一個很好的解釋https://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html – Stan

回答

0

FLOAT並不保證進行任何計算的精度。如果您使用簡單的SELECT,則不進行計算,因此您可以獲得原始值。但是,如果使用SUM(),即使只有一行,也會執行至少一次加法(0 + current_value)。

您真的需要FLOAT嗎?例如,如果您有2位小數位,則可以使用INT並在所有INSERT s之前將所有值乘以100。當SELECT荷蘭國際集團的結果,你會被100

1

FLOATDOUBLE類型在MySQL(以及其它數據庫和編程語言運行時),以特殊的方式,從而導致存儲時近似的值表示分,不是確切的值。見MySQL docs,以及general information on floating-point arithmetics

爲了存儲和操作精確值,請使用類型DECIMAL(請參閱https://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-characteristics.html)。

編輯:我已經運行一些測試,而浮點精度誤差的現象相當普遍,這個特殊的一個看起來是具體到SUM()在MySQL中實現。換句話說,這是一個長期存在的bug。無論如何,您應該使用DECIMAL作爲您的字段類型。

0

如果用戶不是系統管理員並且不能更改字段的數據類型(如FLOAT),則用戶可以使用CAST生成所需的輸出。