SUM MySQL中出现不正确的小数

时间:2015-05-25 20:33:29

标签: mysql sum

我有以下SQL查询。

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

我在潜在客户表中有一行数据,其final_insurance_total值为458796. final_insurance_total的数据类型为float

出于某种原因,MySQL将一行汇总为" 458796.375"。

如果我将查询更改为

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

返回正确的值。世界上到底发生了什么?

3 个答案:

答案 0 :(得分:1)

MySQL中的FLOATDOUBLE类型(以及其他数据库和编程语言运行时)以特殊方式表示,这导致存储的值是近似值,而不是精确值。请参阅MySQL docs以及general information on floating-point arithmetics

要使用精确值存储和操作,请使用DECIMAL类型(请参阅https://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-characteristics.html)。

编辑:我已经运行了一些测试,虽然浮点精度错误很常见,但这个特定的错误看起来特定于MySQL中SUM()的实现。换句话说,这是一个已经存在很长时间的bug。无论如何,您应该使用DECIMAL作为字段类型。

答案 1 :(得分:0)

FLOAT无法保证进行任何计算的精确度。如果您使用简单的SELECT,则不进行任何计算,因此您将获得原始值。但是如果您使用SUM(),即使只有一行,也会执行至少一次添加(0 + current_value)。

你真的需要FLOAT吗?例如,如果您有2个十进制数字,则可以使用INT并在所有INSERT之前将所有值乘以100。当SELECT结果时,您将除以100。

答案 2 :(得分:0)

如果用户不是系统管理员且无法更改FLOAT等字段的数据类型,则用户可以使用CAST生成所需的输出。