我有以下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
返回正确的值。世界上到底发生了什么?
答案 0 :(得分:1)
MySQL中的FLOAT
和DOUBLE
类型(以及其他数据库和编程语言运行时)以特殊方式表示,这导致存储的值是近似值,而不是精确值。请参阅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生成所需的输出。