1.基础知识
(1)二进制转十进制:
示例:
二进制:1010110
转换成十进制:
  12^6+02^5+12^4+02^3+12^2+12^1+02^0*
  =64+0+16+0+4+2+0
  =86
(2)十进制转二进制:除以2,商继续除以2,得到0为止,将余数逆序排列(结果是从下向上读的)。
  如25
  ÷2=12 余下1
  再÷2=6 余下0
  再÷2=3 余下0
  再÷2=1 余下1
  再÷2=0 余下1
  从下向上读 得到 25 转化成二进制结果就是:11001
(3)小数部分转二进制:
小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。
  0.8125x2=1.625 取整1,小数部分是0.625
  0.625x2=1.25 取整1,小数部分是0.25
  0.25x2=0.5 取整0,小数部分是0.5
  0.5x2=1.0 取整1,小数部分是0,结束
  所以0.8125的二进制是0.1101
(4)在计算机中,任何一个数都可以表示成1.xxxxxx2^n 这样的形式,其中xxxxx就表示尾数部分,n表示指数部分。由于任何的一个数表示成这种形式时这里都是1,所以在存储时实际上并不保存这一位,这使得float的23bit的尾数可以表示24bit的精度,double中52bit的尾数可以表达53bit的精度。*
(5) 十进制中的一位数(0到9)在二进制中需要4bit,所以我们现在float中具有24bit的精度,所以float在十进制中具有24(bit)/4(bit/1位)=6(1位),所以在十进制里,float能够精确到小数点后6位。同理,具有53bit精度的double类型能够精确到小数点后13位。
(6)图片说明

P是表示有效数字数的精度。 P范围为1〜65。
D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P。
图片说明
2.浮点数精度损失\数据溢出的问题
(1)因长度限制而造成的误差
如果一个实数的有效数字超过8位,用单精度浮点数来表示的话,就会产生误差!同样,如果一个实数的有效数字超过16位,用双精度浮点数来表示,也会产生误差!对于 1310720000000000000000.66 这个数,有效数字是24位,用单精度或双精度浮点数表示都会产生误差,只是程度不同:
单精度浮点数:1310720040000000000000.00;双精度浮点数: 1310720000000000000000.00,可见,双精度差了 0.66 ,单精度差了近4万亿!
(2)十进制转化为二进制造成,原因是不是所有的数都能转换成有限长度的二进制数
对于131072.32 这个数,其有效数字是8位,按理应该能用单精度浮点数准确表示,为什么会出现偏差呢?看一下这个数据二进制尾数:10000000000000000001010001,显然,其尾数超过了24bit,根据舍入规则,尾数只取 100000000000000000010100,结果就造成测试中遇到的“奇怪”现象!131072.68 用单精度浮点数表示变成 131072.69 ,原因与此类似。实际上有效数字小于8位的数,浮点数也不一定能精确表示,7.22这个数的尾数就无法用24bit二进制表示,当然在数据库中测试不会有问题(舍入以后还是7.22),但如果参与一些计算,误差积累后,就可能产生较大的偏差。
特别说明:本文中的均摘自网上