这个与屏幕没关系,与编绎器环境有关,平时我们说到小数数字时一般都是讲四舍五入,但是C语言里不是,它的规则是“4舍6入5看齐,奇进偶不进”;另外,要看下C里float和double的小数位数的区别。
float的指数位只有8位,而double的指数位有11位,所以:
float占用4个字节,也就是32个比特。
double占用8个字节,也就是64个比特lei。
float和double的范围是由指数的位数来决定的。
范围:
float的指数范围为-127--128,double的范围是-1023-1024。
负指数决定了绝对值最小的非零数,正指数决定了绝对值最大的数。也即决定了范围。
也即float的范围为-2^128-2^128,double的范围是-2^1024-2^1024。
精度:
float和double的精度是由尾数位决定的。浮点数在内存中是按照科学计数法来存储的,其整数部分始终是一个隐藏着的1。由于他是不变的,因此对精度不会造成影响的。
float精度范围是:2^23 = 8388608,一共7位,因此最多能表示7位,但是能保证的是6位。
double的精度范围是2^52 = 4503599627370496,一共16位,同理最多能表示16位,但是能保证的是15位。
结合C小数点保留规则“4舍6入5看齐,奇进偶不进”,才导致了你上面的最后一位小数不同的问题。
|