SQL中float类型字段保留两位小数结果异常如何解决
问题根因
返回结果和预期不符是两个问题叠加导致的:
float属于近似存储类型,不会保存精确十进制值。你看到的显示值0.622,底层实际存储的是非常接近0.622但略小于它的近似值(典型值是0.6219999999999999)- 你之前写的
ROUND(a.totalbudget,2,1)第三个参数传1代表强制截断,不做四舍五入,遇到上述略小于0.622的近似值时,会直接截断到0.61,自然得不到0.62的结果。
正确实现方案
不要直接对float类型字段做精度处理,先显式转成高精度精确十进制类型再做舍入,根据业务场景二选一即可:
- 场景1:对每一行的计算值先保留2位小数,再汇总求和
SUM( CASE WHEN a.TOTALBUDGET > bo.Bobot * 2 THEN CAST(bo.Bobot * 2 AS DECIMAL(18,2)) ELSE CAST(ROUND(CAST(a.totalbudget AS DECIMAL(18,4)), 2) AS DECIMAL(18,2)) END ) AS UW_Rank
逻辑说明:先把float字段转成DECIMAL(18,4)高精度精确值修正浮点数存储偏差,再用默认的四舍五入模式保留2位小数,两个CASE分支统一用相同的精确类型,避免隐式转换带来的计算误差。
- 场景2:先对所有行的原始值求和,再对最终总和保留2位小数
CAST( ROUND( SUM( CASE WHEN a.TOTALBUDGET > bo.Bobot * 2 THEN bo.Bobot * 2 ELSE a.totalbudget END ), 2 ) AS DECIMAL(18,2) ) AS UW_Rank
长期优化建议:凡是需要精确计算的数值字段(比如金额、占比、统计值),数据库字段类型直接用
DECIMAL,不要用float,从根源避免浮点数精度问题。
内容的提问来源于stack exchange,提问作者Tri
相关产品推荐
相关产品推荐

