declare @y numeric(38,36), @x numeric(38,36)
select @y=0.263998462275450127016764362727123456
select @x=0.963998462275450127016764362727654321
select @y+@x --1
select @y*@x --2
select 0.263998462275450127016764362727123456*0.963998462275450127016764362727654321 --3结果:
1.227996924550900254033528725454777777
0.254494111676617352767868706335420
0.2544941116766173527678687063354196236问题:第二个结果为何不等于第三个结果?

解决方案 »

  1.   

    据说混沌加密有一定的可行性( 例如:Xn+1=R*Xn*(1-Xn) ),
    所以打算验证一下效果,刚开始就发现上述问题!
      

  2.   

    参与2和3计算的数据的精度不一样导致的.楼主改成这样:declare @y numeric(36,36), @x numeric(36,36)
    select @y=0.263998462275450127016764362727123456
    select @x=0.963998462275450127016764362727654321
    select @y+@x --1
    select @y*@x --2
    select 0.263998462275450127016764362727123456*0.963998462275450127016764362727654321 --3
      

  3.   

    上面的运算结果就是一致的了.常数可以借助 SQL_VARIANT_PROPERTY 来获得 sql server 将其识别后的数据类型(包括精度)例如:SELECT 
    Type = SQL_VARIANT_PROPERTY(0.263998462275450127016764362727123456, 'basetype'),
    [Precision] = SQL_VARIANT_PROPERTY(0.263998462275450127016764362727123456, 'Precision'),
    [scale] = SQL_VARIANT_PROPERTY(0.263998462275450127016764362727123456, 'scale')
      

  4.   

    明白了,常量0.263998462275450127016764362727123456被当作numeric(38,38)导致的!多谢 zjcxc(邹建)