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,为什么表示形式不一样呢?前面哪一种是怎么表示的?
0x020200010C000000---------这个是什么表示形式呢?
declare @num float
set @num=0.12
select cast(@num as binary(8))
结果为:
0x3FBEB851EB851EB8------为浮点数的754标准表示形式 同样都是0.12,为什么表示形式不一样呢?前面哪一种是怎么表示的?
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 行)
等于是0.12可以表示成0.012*10(用10进制好理解些)
http://blog.csdn.net/Haiwer/archive/2007/07/21/1701408.aspx
因为指数位放在高位[23-30]或者[52-62],而且不是整的4位的,用16进制看的时候变化是很大的
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]由此能看到什么呢?????
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可能是另外一种表示形式,有谁知道呢?
set @r=0.12
select cast(@r as binary(8)) 0x020200010C000000MSSQL会给常量 适合的精度进行转换。这个就是原因!!
这是定长数据表示模式:
0x02 02 00010C000000
02 - 总长度为2位。
02 - 小数位数为2位
00010c000000 - 实际的数据。