如何检查real类型数值小数点后是否有有效数字并按原格式输出
核心问题原因
- 取模报错是因为
%运算符仅支持int、decimal这类精确数值类型,real是近似浮点类型,原生不支持取模运算。 - 之前CASE表达式写法无效,是因为SQL会将CASE所有返回分支隐式转换为精度最高的类型:你一个分支返回普通decimal、一个返回decimal(10,2),最终所有结果都会统一为decimal(10,2),自然都带两位小数。
解决方案
方案1:FORMAT函数(SQL Server 2012及以上版本,最简写法)
FORMAT的0.##格式符会自动适配小数位:整数不显示小数位,有小数时最多保留2位,完全匹配你的需求。
-- 小数点用点号,输出结果:185、193.5、80 FORMAT(CAST(GWF_Score AS DECIMAL(10,2)), '0.##') AS [@points] -- 小数点用逗号,和你表中格式完全一致,输出结果:185、193,5、80 FORMAT(CAST(GWF_Score AS DECIMAL(10,2)), '0.##', 'de-DE') AS [@points]
方案2:CASE判断兼容低版本SQL Server
如果数据库版本不支持FORMAT函数,先将real转为精确decimal类型再判断,最终输出字符串保留格式即可:
CASE -- 转成decimal后判断是否为整数 WHEN CAST(GWF_Score AS DECIMAL(10,2)) = FLOOR(CAST(GWF_Score AS DECIMAL(10,2))) THEN CAST(CAST(GWF_Score AS INT) AS VARCHAR(20)) -- 非整数场景去掉末尾多余的.00,需要逗号的话把替换规则改成',00'即可 ELSE REPLACE(CAST(CAST(GWF_Score AS DECIMAL(10,2)) AS VARCHAR(20)), '.00', '') END AS [@points]
注意事项
- 必须先将real类型转成decimal再做运算,避免浮点精度误差导致判断错误。
- 最终输出为字符串类型,XML会直接保留设置的格式,不会自动补全小数位。
内容的提问来源于stack exchange,提问作者k.troy2012
相关产品推荐
相关产品推荐

