为什么这个简单的查询会失败? select 转换(十进制(10,8),111.1)

Why this simple query fail? select convert(decimal(10,8),111.1)

正在 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) 这会失败?

错误是

Msg 8115, Level 16, State 8, Line 1 Arithmetic overflow error converting numeric to data type numeric.

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

要完整存储 111.175933837891,您必须使用 至少 12 的比例和至少 3 的精度超过比例,因此 decimal(15,12) 将是可以保持该值而不损失精度的最小类型。

因为小数位数是 8,精度是 10

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

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

您必须增加 precision 的小数位或减少 scale 的小数位。

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