【问题标题】:Why this simple query fail? select convert(decimal(10,8),111.1)为什么这个简单的查询会失败?选择转换(十进制(10,8),111.1)
【发布时间】:2015-01-12 15:39:14
【问题描述】:

使用 SQL Server 2005

为什么会失败?

select convert(decimal(10,8),111.1)

这个工作正常

select convert(decimal(10,8),11.1)

我该如何解决?

在我真正的查询中,我有这个值。

转换(十进制(10,8),111.175933837891)

但我检查了问题是 3 个 Int 和 N 个小数, 为什么如果我有 decimal(10,8) 这会失败?

错误是

消息 8115,级别 16,状态 8,第 1 行算术溢出错误 将数值转换为数值数据类型。

【问题讨论】:

  • 错误信息是什么?
  • 哪个 dbms? (ANSI SQL 没有转换功能。)

标签: sql sql-server decimal


【解决方案1】:

decimal(10,8)代表一个10位的数字total和小数点右边8位,所以可以表示的最大数字是99.99999999 .您可以使用decimal(10,7) 并在小数点右侧保留一位数字,或者使用decimal(11,8) 在左侧添加一位数字。

要完全存储111.175933837891,您必须使用至少 12 的刻度和比刻度高至少 3 的精度,所以decimal(15,12) 会是可以在不损失精度的情况下保持该值的最小类型。

【讨论】:

  • 因为小数点左边只有两位数可用 (10-8 = 2)
【解决方案2】:

因为比例是8,精度是10

总数小数点前的位数是precision - scale

10-8 = 2 所以在decimal 之前只能有2 数字。但是111.175933837891 中的小数点前有 3 位数字,所以它会抛出 Arithmetic overflow error

您必须以十进制增加precision 或以十进制减少scale

select convert(decimal(11,8),111.175933837891)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2011-08-08
    相关资源
    最近更新 更多