http://www.cnblogs.com/yaozhongxiao/archive/2010/09/08/1821185.html
http://blog.csdn.net/demon__hunter/article/details/3566232
已经有人写好了,我就不写了。
一个人,只认识二进制,他要表达十进制中的9,需要写成1001,换算公式为1*2^3+0*2^2+0*2^1+1*2^0=9。
他要表达十进制中的9.5,需要写成1001.1,换算公式为1*2^3+0*2^2+0*2^1+1*2^0+1*2^(-1)=9.5。
如果有一个二进制为1001.1001,它是十进制中的1*2^3+0*2^2+0*2^1+1*2^0+1*2^(-1)+0*2^(-2)+0*2^(-3)+1*2^(-4)=9.5625。
=========================================
double占64bit,其中符号位1位,指数位11位,小数部分52位,指数偏移量是1023。
小数部分是指【yyy.xxx】,其中xxx是52个零壹字符串。
当偏移量为正值(大于0)时,小数点右移偏移量个位置。
当偏移量为负值(小于0)时,小数点左移偏移量个位置。
当偏移量为0时,小数位的值=(0/1)*2^(-1)+(0/1)*2^(-2)+(0/1)*2^(-3)+...+(0/1)*2^(-52)。
当我们把2^(-52)作为一个单位时,小数位的值就是xxx(共52个x的零壹字符串)个单位。
所以,小数位的值value=multiple*2^(-52)。
所以multiple=value*2^52。
因为2^52=......370500,所以,value为0.01的倍数的时候,multiple都是整数。
所以,double可以完美的表示所有的两位小数。
但是double d=17.7时,VS2013显示的是17.699999999999999,这很令人诧异。
====================================