在SQL Server中处理varchar中的小数时使用ROUND()
我知道Round()的用法,它可以很好地用于在SQL Server中处理varchar中的小数时使用ROUND(),sql,sql-server,tsql,Sql,Sql Server,Tsql,我知道Round()的用法,它可以很好地用于 select round(147.26719,5,1) 返回147.26719 目前,我正在处理一个从txt文件导入的表,因此当我使用round()处理varchar中的十进制时,所有列都是varchar select round('147.26719',5,1) 非常奇怪,它返回147.26718 我将使其正确运行 select round(cast('147.26719', decimal(11,6)),5,1) 但有人能解释一下为什么会发
select round(147.26719,5,1)
返回147.26719
目前,我正在处理一个从txt文件导入的表,因此当我使用round()
处理varchar中的十进制时,所有列都是varchar
select round('147.26719',5,1)
非常奇怪,它返回147.26718
我将使其正确运行
select round(cast('147.26719', decimal(11,6)),5,1)
但有人能解释一下为什么会发生这种情况吗?我相信当将varchar隐式转换为十进制时,会出现这种情况,但我不知道为什么
预先感谢默认情况下,
round()
的字符串隐式转换为浮点值
,而不是十进制值。浮点数是不精确的,可能和你所看到的相差一点点,但足够重要了
您的解决方案是正确的--转换为十进制
通过使用以下代码,您可以很容易地看到这一点:
select round('123.3', 1) as col
into x;
select *
from information_schema.columns
where table_name = 'x';
或者,
选择SQL_Variant_属性(Round('123.3',1),'BaseType')代码>。谢谢!这就解释了