为什么在SQL Server中舍入从float转换为varchar的原因

时间:2011-06-28 19:27:15

标签: sql-server sql-server-2005 floating-point

关注sql

declare @a as float, @b as float

select @a=1.353954 , @b=1.353956
select 
CAST(@a as VARCHAR(40)) AS a_float_to_varchar ,
CAST(@b as VARCHAR(40)) AS b_float_to_varchar

结果

a_float_to_varchar                       b_float_to_varchar
---------------------------------------- ----------------------------------------
1.35395                                  1.35396

基于

http://msdn.microsoft.com/en-us/library/ms173773.aspx

float具有15位数的精度,因此我不确定为什么在转换为varchar

时该数字被舍入

3 个答案:

答案 0 :(得分:13)

同样来自您的链接(实际上是第一行):

  

近似数据类型......

如果您想要精确的精确度,请不要使用float

话虽如此,但有一个函数STR()专门用于将float转换为字符数据类型。

答案 1 :(得分:4)

在转换为varchar之前强制转换为十进制:

declare @a as float, @b as float

select @a=1.353954 , @b=1.353956
select 
CAST(CAST(@a AS DECIMAL(38,18)) as VARCHAR(40)) AS a_float_to_varchar ,
CAST(CAST(@b AS DECIMAL(38,18)) as VARCHAR(40)) AS b_float_to_varchar

答案 2 :(得分:3)

您可以指定样式以包含更多数字。

declare @gg float
set @gg = 124.323125453
SELECT @gg,Convert(varchar, @gg,128)

对于较新版本的sql server使用SELECT @gg,Convert(varchar, @gg,3)

返回

124.323125453   124.323125453

https://msdn.microsoft.com/en-us/library/ms187928.aspx

或使用STR()

declare @gg float
set @gg = 124.323124354234524
SELECT @gg,str(@gg,16,15)

应该给你所有可能的数字。 16是总可能的长度(包括周期),而十进制之后的15个位置是可能的(实际上是0.2323 ... 0计数到长度,所以如果所有数字都小于1则长度需要为17)STR()然而垫前导空格和尾随0的结果。