SQL 服务器 - 舍入问题

SQL Server - Rounding off issue

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

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

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

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

声明@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.

您也可以使用

CONVERT

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

但这将为您提供科学记数法的输出。