当我运行查询时:
(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