SQL Server-舍入问题



下面是我在SQL Server存储过程中使用的部分代码。

DECLARE @MinimumTime FLOAT,
@filter VARCHAR(MAX)
SET @MinimumTime = 43885.664166666664241
SELECT @filter =  COALESCE('[Time.Minimum] >= ' + CAST(@MinimumTime AS varchar(MAX)), '')
PRINT @filter

这会产生以下输出:

[Time.Minimum] >= 43885.7

这不是预期的并且影响过程的输出。我不希望这个数值被四舍五入。我想要我传递的完整浮点值。下面是这样的。

[Time.Minimum] >= 43885.664166666664241

如果您需要任何其他信息,请告诉我。

使用参数!这是获得"精确"浮点值的唯一方法:

声明@sql nvarchar(max(;

set @sql = N'
select *
from t
where '[Time.Minimum] >= @MinimumTime
';
exec sp_executesql @sql,
N'@MinimumTime float',
@MinimumTime=@MinimumTime;

换句话说,不要转换为字符串。

请尝试以下从浮点到数字的查询SQL-FIDDLE:

DECLARE @MinimumTime numeric(32,15),
@filter VARCHAR(MAX)
SET @MinimumTime = 43885.664166666664241
SELECT @filter =  COALESCE('[Time.Minimum] >= ' + cast(@MinimumTime as varchar(MAX)), '')
select @filter

注意

The basic difference between Decimal/Numeric and Float :
Float is Approximate-number data type, which means that not all values in the data type range can be represented exactly.
Decimal/Numeric is Fixed-Precision data type, which means that all the values in the data type reane can be represented exactly with precision and scale.

您也可以使用

转换

SELECT @filter =  COALESCE('[Time.Minimum] >= ' + CONVERT(NVARCHAR(30), @MinimumTime,2), '')

但这会给你科学记数法的输出。

最新更新