declare @num1 numeric(28,8),@num2 numeric(28,8),@num3 numeric(28,8)
select @num1=1.0,@num2=0.0002046
select @num3=@num1*@num2
select @num3
为什么结果不是0.0002046而是0.0002050?
如果要使得到的结果保持在小数点后8位有效,要怎么做?
select @num1=1.0,@num2=0.0002046
select @num3=@num1*@num2
select @num3
为什么结果不是0.0002046而是0.0002050?
如果要使得到的结果保持在小数点后8位有效,要怎么做?
,@num2 float--float--numeric(28,8)
,@num3 float--numeric(28,8)
select @num1=1.0,@num2=0.0002046
select @num3=@num1*@num2
select @num3
-----------------------------------------------------
2.0460000000000001E-4(影響 1 個資料列)
select @num1=1.0,@num2=0.00020046
select @num3=@num1*@num2
select @num3
------------------------
0.00020046(1 row(s) affected)
select @num1=1.0,@num2=0.00020460
select @num3=@num1*@num2
select @num3
------------------------------
.00020460(所影响的行数为 1 行)
当两个 decimal 相乘时,其结果的类型提 decimal, 其精度和小数位的算法是
结果精度 = p1 + p2 + 1
结果小数位 = s1 + s2
结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,相应的小数位数会减少,以避免结果的整数部分被截断
计算结果的数据类型是 numeric
结果精度 = p1 + p2 + 1 = 28 + 28 + 1 = 57
结果小数位 = s1 + s2 = 8 + 8 = 16
结果的精度大于 38 , 于是为 38,然后会减少小数位,以避免整数部分被截断,这样小数于就没有 16 了,至于这些小数位减少是如何算的,没有找到资料我只可以可以查到 @num1 * @num2 的结果数据类型是 numeric(38, 6)
DECLARE
@num1 numeric(21,7),
@num2 numeric(21,9),
@num3 numeric(28,8) SELECT
@num1 = 1.0,
@num2 = 0.1002046
SELECT
@num3 = @num1*@num2
SELECT @num3-- 了解计算结果类型信息
DECLARE
@_num3 sql_variant
SELECT
@_num3 = @num1 * @num2SELECT
Type = SQL_VARIANT_PROPERTY(@_num3 , 'BaseType' ),
Precision = SQL_VARIANT_PROPERTY(@_num3 , 'Precision' ),
Scale = SQL_VARIANT_PROPERTY(@_num3 , 'Scale' )
DECLARE
@num1 numeric(23,8),
@num2 numeric(22,8),
@num3 numeric(22,8) SELECT
@num1 = 1.0,
@num2 = 0.00002046
SELECT
@num3 = @num1*@num2
SELECT @num3
/*
0.00002046
*/
還沒截斷, 但是如果p1+p2>55,就開始截了...