我有以下SQL查询:
SELECT SUM(final_insurance_total) as total
FROM `leads`
GROUP BY leads.status
在lead表中只有一行数据,final_insurance_total的值为458796。final_insurance_total的数据类型为float
。
由于某些原因,MySQL将单行求和为"458796.375"。
如果我将查询改为
SELECT (final_insurance_total) as total
FROM `leads`
GROUP BY leads.status
返回正确的值。到底发生了什么事?
MySQL(以及其他数据库和编程语言运行时)中的FLOAT
和DOUBLE
类型以一种特殊的方式表示,这导致存储的值是近似值,而不是精确值。参见MySQL文档,以及浮点运算的一般信息。
为了存储和操作精确的值,使用DECIMAL
类型(参见https://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-characteristics.html)。
EDIT:我已经运行了一些测试,虽然浮点精度错误很常见,但这个特殊的错误看起来是特定于MySQL中SUM()
的实现。换句话说,这是一个已经存在了很长时间的bug。无论如何,您应该使用DECIMAL
作为您的字段类型。
FLOAT
不保证任何计算的精度。如果您使用简单的SELECT
,则不进行计算,因此您将获得原始值。但是如果您使用SUM()
,即使只有一行,至少执行一次添加(0 + current_value
)。
你真的需要FLOAT
吗?例如,如果您有两个十进制数字,您可以使用INT并在所有INSERT
之前将所有值乘以100。当SELECT
结果时,您将除以100。
如果用户不是系统管理员,并且不能更改字段的数据类型,例如FLOAT,则用户可以使用CAST来生成所需的输出