Sql server 小数精度和小数位数

Sql server 小数精度和小数位数,sql-server,type-conversion,decimal,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_VARIA

此表达式使用隐式转换:

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
  • 最大长度5
我相信我理解所有的结果,除了精度。 若小数点左边的位数为2,右边的位数为6,则总数为8

为什么SQL Server在这里计算9

另外,我使用SQL Server 2008 R2

看看这个部分

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

原因

Arithmetic overflow error converting varchar to data type numeric.

对不起,我应该自己做RTFM,谢谢!现在我必须找出为什么会出现这种精度增加。
Arithmetic overflow error converting varchar to data type numeric.