将FLOAT转换为NVARCHAR时小数位数不一致的原因探究
为什么FLOAT转NVARCHAR后小数位数会有差异?
这个问题的核心其实藏在FLOAT类型的特性和SQL Server的字符串转换规则里,我给你拆解清楚:
FLOAT是近似数值类型,并非精确存储
FLOAT(包括SQL Server里的REAL)是基于IEEE 754标准的近似型数字,它不会精确存储你输入的十进制小数123.1234。实际上,这个值被转换成二进制存储时,是一个非常接近123.1234的近似值,而非完全等价。CAST(FLOAT AS NVARCHAR)的默认格式化规则
当你把FLOAT转成字符串时,SQL Server默认只会保留最多6位有效数字。所以你看到的123.123,其实是对那个近似FLOAT值的6位有效数字展示。而你查询结果里的123,1234(逗号是你的系统区域设置的小数分隔符),是查询工具(比如SSMS)对FLOAT值的展示格式——工具会根据区域设置格式化数字,并且可能显示更多位数,但这只是展示层的处理,不代表存储的FLOAT值是精确的。
如果你想要让转换后的字符串保留更多小数位,可以用STR()函数来指定精度,比如:
SELECT CAST('123.1234' AS FLOAT) AS 'Float value', STR(CAST('123.1234' AS FLOAT), 10, 4) AS 'Text value with specified precision';
这样就能得到更接近原始值的字符串结果了。
内容的提问来源于stack exchange,提问作者Klika84
相关产品推荐
相关产品推荐

