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

N30*_*N30 7 sql-server floating-point sql-server-2005

继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
Run Code Online (Sandbox Code Playgroud)

结果是

a_float_to_varchar                       b_float_to_varchar
---------------------------------------- ----------------------------------------
1.35395                                  1.35396
Run Code Online (Sandbox Code Playgroud)

基于

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

float具有15位数的精度,因此我不确定为什么在转换为varchar时该数字被舍入

JNK*_*JNK 14

也来自你的链接(它实际上是第一行):

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

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

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

  • @JNK正是我要问的是,如果值小于15位,例如1.353954,而不是将其转换为varchar(40)应该是1.353954然后是0到15位,然后是大约序列,但它在6个字符后舍入.我会尝试使用STR()让你知道. (2认同)

A-K*_*A-K 5

在转换为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
Run Code Online (Sandbox Code Playgroud)


bli*_*guy 5

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

declare @gg float
set @gg = 124.323125453
SELECT @gg,Convert(varchar, @gg,128)
Run Code Online (Sandbox Code Playgroud)

对于较新版本的 SQL Server,请使用 SELECT @gg,Convert(varchar, @gg,3)

返回

124.323125453    124.323125453
Run Code Online (Sandbox Code Playgroud)

参考:CAST 和 CONVERT (Transact-SQL)

或者使用 STR():

declare @gg float
set @gg = 124.323124354234524
SELECT @gg,str(@gg,16,15)
Run Code Online (Sandbox Code Playgroud)

它应该给你所有可能的数字。16 是可能的总长度(包括句点),而小数点后有 15 位是可能的(实际上是 0.2323 ... 0 计入长度,因此如果所有数字都小于 1,则长度需要为 17)。但是,STR() 用前导空格和尾随 0 填充结果。