十进制精度和比例

时间:2013-07-18 08:46:34

标签: sql-server type-conversion decimal

此表达式使用隐式转换:

SELECT 9.999 * '9.999'

并评估99.980001。

如果我使用以下方式记录类型信息:

SELECT
    SQL_VARIANT_PROPERTY(9.999 * '9.999', 'BaseType'),
    SQL_VARIANT_PROPERTY(9.999 * '9.999', 'Precision'),
    SQL_VARIANT_PROPERTY(9.999 * '9.999', 'Scale'),
    SQL_VARIANT_PROPERTY(9.999 * '9.999', 'MaxLength')

我明白了:

  • BaseType 数字
  • 精确度 9
  • 比例 6
  • MaxLength 5

我相信除了精确度之外,我理解所有结果。 如果小数点左边的数字是2,右边是6,则总计为8。

为什么SQL Server在这里计算9?

P.S。我使用SQL Server 2008 R2

1 个答案:

答案 0 :(得分:3)

来自Precision, Scale, and Length (Transact-SQL)

查看

部分
Operation:
e1 * e2

你会找到

Result precision
p1 + p2 + 1

所以在您的情况下4+4+1 => 9

除此之外,你会注意到

SELECT  SQL_VARIANT_PROPERTY(99.999 * '9.999', 'Precision'), --11 => p1+p1+1
        SQL_VARIANT_PROPERTY(99.999 * '99.999', 'Precision'), --11 => p1+p1+1
        SQL_VARIANT_PROPERTY(99.999 * 9.999, 'Precision'), --10 => p1+p2+1
        SQL_VARIANT_PROPERTY(99.999 * 99.999, 'Precision') -- 11 => p1+p2+1

,而

SELECT  SQL_VARIANT_PROPERTY(9.999 * '9.999', 'Precision') --9 => p1+p1+1

SELECT  SQL_VARIANT_PROPERTY(9.99 * '9.999', 'Precision')

cuases

Arithmetic overflow error converting varchar to data type numeric.