如何在SQL Server中实现无舍入、无填充的Float转Varchar?
在SQL Server中无舍入、无补零转换Float到Varchar的解决方案
嘿,这个问题我之前处理过好几次!直接用CAST或者STR转换Float类型确实容易踩坑——要么被舍入截断,要么被强制补零。下面给你几个实用的解决办法,完美匹配你的预期结果:
方法一:用FORMAT函数(最简洁)
FORMAT函数的'G'格式说明符会自动保留原始有效数字,去掉末尾多余的零,还不会随意舍入,简直是为这个场景量身定做的:
DECLARE @A AS FLOAT, @B AS FLOAT SELECT @A=1.353954 , @B=1.353 SELECT FORMAT(@A, 'G') AS A_FLOAT_TO_VARCHAR, -- 输出:1.353954 FORMAT(@B, 'G') AS B_FLOAT_TO_VARCHAR -- 输出:1.353
方法二:先转DECIMAL再转Varchar(精度可控)
如果需要严格控制小数位数,可以先把Float转成DECIMAL类型(指定足够的精度和小数位),再转成Varchar。这个方法适合你明确知道数据小数位数范围的场景:
DECLARE @A AS FLOAT, @B AS FLOAT SELECT @A=1.353954 , @B=1.353 SELECT CAST(CAST(@A AS DECIMAL(18,6)) AS VARCHAR(40)) AS A_FLOAT_TO_VARCHAR, -- 输出:1.353954 CAST(CAST(@B AS DECIMAL(18,3)) AS VARCHAR(40)) AS B_FLOAT_TO_VARCHAR -- 输出:1.353
注意:DECIMAL的第二个参数(小数位数)要根据你的实际数据调整,确保能容纳所有有效数字。
方法三:用STR结合字符串处理(兼容旧版本)
如果你的SQL Server版本不支持FORMAT(比如2012之前的版本),可以用STR生成足够长的小数位,再通过字符串操作去掉末尾的零和多余的小数点:
DECLARE @A AS FLOAT, @B AS FLOAT SELECT @A=1.353954 , @B=1.353 SELECT -- 处理后去掉末尾零和多余小数点 CASE WHEN RIGHT(RTRIM(REPLACE(STR(@A, 20, 10), '0', ' ')), 1) = '.' THEN LEFT(RTRIM(REPLACE(STR(@A, 20, 10), '0', ' ')), LEN(RTRIM(REPLACE(STR(@A, 20, 10), '0', ' ')))-1) ELSE RTRIM(REPLACE(STR(@A, 20, 10), '0', ' ')) END AS A_FLOAT_TO_VARCHAR, -- 输出:1.353954 CASE WHEN RIGHT(RTRIM(REPLACE(STR(@B, 20, 10), '0', ' ')), 1) = '.' THEN LEFT(RTRIM(REPLACE(STR(@B, 20, 10), '0', ' ')), LEN(RTRIM(REPLACE(STR(@B, 20, 10), '0', ' ')))-1) ELSE RTRIM(REPLACE(STR(@B, 20, 10), '0', ' ')) END AS B_FLOAT_TO_VARCHAR -- 输出:1.353
为什么原来的方法会出问题?
CAST(@A AS VARCHAR(40)):Float类型的存储特性导致转换时默认只保留6位有效数字,所以1.353954被截断成了1.35395;STR(@B, 25, 5):这个函数的第三个参数强制指定了5位小数位数,不足的部分会用零填充,所以1.353变成了1.35300。
内容的提问来源于stack exchange,提问作者Veera V
相关产品推荐
相关产品推荐

