我正在尝试编写一个存储过程,但是我得到了意外的除以0的异常。
我将其范围缩小到以下示例。
为什么在世界上这样做:
declare @A decimal; declare @B decimal; declare @C decimal; set @A = 4; set @B = 9; set @C = @A/@B select @A/@B as 'Expected' select @C as 'Wut'
结果呢?
Expected --------------------------------------- 0.4444444444444444444 (1 row(s) affected) Wut --------------------------------------- 0 (1 row(s) affected)
问题是您尚未为decimal类型指定比例。从MSDN:
decimal
s(比例) 将存储在小数点右边的小数位数。从p中减去此数字可确定小数点左边的最大位数。小数位数必须是0到p之间的值。仅在指定精度的情况下才能指定比例。 默认比例为0 ; 因此,0 <= s <= p。
s(比例)
将存储在小数点右边的小数位数。从p中减去此数字可确定小数点左边的最大位数。小数位数必须是0到p之间的值。仅在指定精度的情况下才能指定比例。 默认比例为0 ; 因此,0 <= s <= p。
因此,当您尝试存储@A/@B回时@C,小数部分会被截断。
@A/@B
@C
注意:
declare @A decimal(18, 3); declare @B decimal(18, 3); declare @C decimal(18, 3); set @A = 4; set @B = 9; set @C = @A/@B select @A/@B -- 0.44444444444444444444 select @C -- 0.444