与小数相乘会导致 SQL Server 2016 中的值不正确



当我运行查询时:

(SELECT (CONVERT(DECIMAL, COUNT(SequenceId)) * 0.6)  FROM dbo.usvSequenceToSequence_WithSequenceId)

我得到的结果:17550年

但是,当我运行查询时:

DECLARE @percentageOfSliceAsDecimal DECIMAL
    SET @percentageOfSliceAsDecimal = 0.6
(SELECT (CONVERT(DECIMAL, COUNT(SequenceId)) * @percentageOfSliceAsDecimal)  FROM dbo.usvSequenceToSequence_WithSequenceId)

我得到的结果:29250

为什么会这样?

您需要以适当的精度声明:

declare @d decimal(10,2) = 0.6
select(convert(decimal,1982)*@d)

它返回 1189.20

而如果我们只有十进制

declare @d decimal = 0.6
select(convert(decimal,1982)*@d)

它返回 1982,因为它四舍五入为 1

十进制不是"浮点数"。 它是一个固定的"非浮动"数字,在小数点的每一侧都有定义数量的十进制数字。默认值为左侧 18 位数字和零 (0(,或者右侧没有数字。

因此,无论您将其定义为什么,都控制着存储的内容。如果尝试存储比定义更多的数字,则额外的数字将被舍入(如果向右(或忽略。

如果您需要输入的任何小数精度的精度,请使用"浮点数"或"实数"。

发生这种情况是因为声明为 DECIMAL 的变量没有在小数点右侧指定任何值(根据此处的定义:https://learn.microsoft.com/en-us/sql/t-sql/data-types/decimal-and-numeric-transact-sql(,这会导致四舍五入。这可以观察到如下:

DECLARE @percentageOfSliceAsDecimal DECIMAL
    SET @percentageOfSliceAsDecimal = 0.6
    SELECT @percentageOfSliceAsDecimal

结果为 1

解决方案是改为执行以下操作:

DECLARE @percentageOfSliceAsDecimal DECIMAL(18,1)
    SET @percentageOfSliceAsDecimal = 0.6
    SELECT @percentageOfSliceAsDecimal

最新更新