日期:2014-05-18  浏览次数:20595 次

最简单的的乘法。
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),