记double&float

  • float :符号位(1bit),指数位(8bit),尾数(23bit)
    注意:尾数最左手边的1并不会储存,因为它一定存在(二进制的第一个有效数字必定是1)。换言之,有效数位是24位,实际储存23位。
  • double:符号位(1bit),指数位(11bit),尾数(52bit)
  • Java默认小数为double,如需要设置float,需要定义0.1f/0.1F
失真
  • IEEE754标准规定的指数偏移量2^(n-1) -1
  • float 指数范围 -128~127(2^(8-1)-1 = 107)
  • double 指数范围-1024~1023(2^(11-1)-1 = 1023)
计算机在处理数据时会进行二进制和十进制的转换,经过处理后得到的十进制并不精确
  • float和double的精度是由尾数决定的
  • float尾数为2^²³= 8388608精度7位,由于尾数有效位数是24位,2^24= 16777216精度8位,所以float精度为7~8位。
  • double尾数2^52= 4503599627370496,16位,所以double精度位16~17位

十进制转二进制时小数位可能会无穷无尽,但是精度位数是有限的,所以会出现失真的情况。
如0.3转换为二进制
0.3 * 2 = 0.6 > 0
0.6 * 2 = 1.2 > 1
0.2 * 2 = 0.4 > 0
0.4 * 2 = 0.8 > 0
0.8 * 2 = 1.6 > 1
0.6 * 2 = 1.2 > 1
······
精度保留16位:0.0100110011001100

参考资料1、参考资料2、参考资料3

你可能感兴趣的:(记double&float)