select cast(0.12 as binary(8)) --as char(6)) 结果为: 
0x020200010C000000---------这个是什么表示形式呢? 
declare @num float 
set @num=0.12 
select cast(@num as binary(8)) 
结果为: 
0x3FBEB851EB851EB8------为浮点数的754标准表示形式 同样都是0.12,为什么表示形式不一样呢?前面哪一种是怎么表示的?

解决方案 »

  1.   

    sql server 认为第一个0.12是real
      

  2.   

    无论是real还是float,在计算机中的表示都是采用的是IEEE754标准吧。
      

  3.   

    declare @num numeric(10,2)
    set @num=0.12 
    select cast(@num as binary(8)) 结果                   
    ------------------ 
    0x0A0200010C000000(所影响的行数为 1 行)
    declare @num numeric(10,3)
    set @num=0.12 
    select cast(@num as binary(8)) 结果                   
    ------------------ 
    0x0A03000178000000(所影响的行数为 1 行)
      

  4.   

    IEEE754标准浮点数也有32位和64位之分,而且,同样的是32位,表示同一个数,其指数位、尾数位的位数也是可以浮动的,
    等于是0.12可以表示成0.012*10(用10进制好理解些) 
      

  5.   

    看看我以前的文章
    http://blog.csdn.net/Haiwer/archive/2007/07/21/1701408.aspx
    因为指数位放在高位[23-30]或者[52-62],而且不是整的4位的,用16进制看的时候变化是很大的
     
      

  6.   

    [code=SQL]
    select cast(0.12 as binary(8)) --as char(6))                    
    ------------------ 
    0x020200010C000000(所影响的行数为 1 行)
    [/select cast(0.120 as binary(8)) --as char(6)) ------------------ 
    0x0303000178000000(所影响的行数为 1 行)
    select cast(0.1200 as binary(8)) --as char(6)) 
                       
    ------------------ 
    0x04040001B0040000(所影响的行数为 1 行)
    [code]由此能看到什么呢?????
      

  7.   


    754标准我仔细看过:在754的64位标准中,第一位为符号位,然后使用11表示阶码,采用移码表示,剩余52位表示尾数。
    --------采用64位表示
       采用的是IEEE754中64位浮点数格式来表示的。具体的方式如下:第一位为符号位,下来的11位表示阶码,采用移码表示,剩下的52位表示位数。
    0.12对应的二进制数据为0.00011110101110000101(循环00011110101110000101),如果表示成规格化数据为
    0.11110101110000101*2^-4(小数点向右移动了4位)。754标准规定了存储的格式为1.M*2^E+1024-1(E为-4).
    那么0.12表示为754标准的形式:第一位为0,阶码为1019,对应的二进制数据为:01111111011,尾数为:
    111010111000010100011110101110000101…………。所以二进制编码为:
    001111111011111010111000010100011110101110000101…………对应的16进制就是看到的3FBEB851EB851EB8。----采用32位表示
    采用的是IEEE754中32位浮点数格式来表示的。具体的方式如下:第一位为符号位,下来的8位表示阶码,采用移码表示,剩下的23位表示位数。
    0.12对应的二进制数据为0.00011110101110000101(循环00011110101110000101),如果表示成规格化数据为
    0.11110101110000101*2^-4(小数点向右移动了4位)。754标准规定了存储的格式为1.M*2^E+128-1(E为-4).
    那么0.12表示为754标准的形式:第一位为0,阶码为123,对应的二进制数据为:01111011,尾数为:
    11101011100001010001111。所以二进制编码为:
    00111101111101011100001010001111对应的16进制就是看到的3DF5A28F。可以看到和上面的select cast(0.12 as binary(8))的结果是不一样的。
    所以我觉得select cast(0.12 as binary(8))这里的0.12可能是另外一种表示形式,有谁知道呢?
      

  8.   

    declare @r numeric(2,2)
    set @r=0.12
    select cast(@r as binary(8)) 0x020200010C000000MSSQL会给常量 适合的精度进行转换。这个就是原因!!
      

  9.   

    select cast(0.12 as binary(8))
    这是定长数据表示模式:
    0x02 02 00010C000000
      02 -   总长度为2位。
          02 - 小数位数为2位
             00010c000000 - 实际的数据。