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位有效,要怎么做?

解决方案 »

  1.   

    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 個資料列)
      

  2.   

    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)
      

  3.   

    把numeric 改為real 也可以精確到8位
      

  4.   

    学习,为什么numeric却不行呢??
      

  5.   

    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 行)
      

  6.   

    decimal与 numeric 同义, 它们的定义是: decimal[ (p[ , s] )] 
    当两个 decimal 相乘时,其结果的类型提 decimal, 其精度和小数位的算法是
    结果精度   = p1 + p2 + 1
    结果小数位 = s1 + s2
    结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,相应的小数位数会减少,以避免结果的整数部分被截断
      

  7.   

    照楼主的定义
    计算结果的数据类型是 numeric
    结果精度   = p1 + p2 + 1 = 28 + 28 + 1 = 57
    结果小数位 = s1 + s2     = 8 + 8       = 16
    结果的精度大于 38 , 于是为 38,然后会减少小数位,以避免整数部分被截断,这样小数于就没有 16 了,至于这些小数位减少是如何算的,没有找到资料我只可以可以查到 @num1 * @num2 的结果数据类型是 numeric(38, 6)
      

  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 * @num2SELECT 
    Type = SQL_VARIANT_PROPERTY(@_num3 , 'BaseType' ),
    Precision = SQL_VARIANT_PROPERTY(@_num3 , 'Precision' ),
    Scale = SQL_VARIANT_PROPERTY(@_num3 , 'Scale' )
      

  9.   

    報告,玩了一下,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,就開始截了...