【问题标题】:Decimal precision and scale小数精度和小数位数
【发布时间】:2013-07-17 02:58:05
【问题描述】:

此表达式使用隐式转换:

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

【问题讨论】:

    标签: sql-server type-conversion decimal


    【解决方案1】:

    来自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')
    

    原因

    Arithmetic overflow error converting varchar to data type numeric.
    

    【讨论】:

    • 对不起,我应该自己有 RTFM,谢谢!现在我必须找出为什么会发生这种精度增量。
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 2012-08-19
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多