最简单的的乘法。
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位有效,要怎么做?
[解决办法]
很奇怪
[解决办法]
declare @num1 float--numeric(28,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 個資料列)
[解决办法]
呵呵。是比较怪。期待高手回复。。
[解决办法]
declare @num1 real,@num2 real,@num3 real
select @num1=1.0,@num2=0.00020046
select @num3=@num1*@num2
select @num3
------------------------
0.00020046
(1 row(s) affected)
[解决办法]
把numeric 改為real 也可以精確到8位
[解决办法]
学习,为什么numeric却不行呢??
[解决办法]
declare @num1 int,@num2 numeric(28,8),@num3 numeric(28,8)
select @num1=1.0,@num2=0.00020460
select @num3=@num1*@num2
select @num3
------------------------------
.00020460
(所影响的行数为 1 行)
[解决办法]
decimal与 numeric 同义, 它们的定义是: decimal[ (p[ , s] )]
当两个 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)
[解决办法]
所以,如果楼主把精度定小一点,说它两个加起来不那么长,比如不超过 38, 或者加起来虽然 38, 但不超过很多,这样小数位会减少得少一些,只要小数位减少控制到楼主要的 8 位以上,则结果都是楼主要的了
[解决办法]
-- 下面演示如何知道计算结果类型信息
-- 测试数据
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 * @num2
SELECT
Type = SQL_VARIANT_PROPERTY(@_num3 , 'BaseType ' ),
Precision = SQL_VARIANT_PROPERTY(@_num3 , 'Precision ' ),
Scale = SQL_VARIANT_PROPERTY(@_num3 , 'Scale ' )
[解决办法]
老大到底是老大
[解决办法]
報告,玩了一下,ms到
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,就開始截了...