简单点说,十进制数如何表示1/3呢,0.333333……,再乘以几个10也抹不掉小数点!
二进制数如何表示0.3呢?再乘以几个2也抹不掉小数点!
3.14159269不能用八位十进制31415926表示
123.123同样不能用二十三位的float表示
------------------------打比方和原理的分割线
浮点数由1位符号位 + 若干位指数位 + 若干小数位 组成
float就是1位符号位 + 8位指数位 +23位小数位
float:2^23=8388608,一共7位,能绝对能保证的为6位,也即float的精度为6~7位。
123.123转化的时候,先将123转化为1111011
再将0.123转化为(假设)0001010100110011001010010100100101010010……
最后加起来123.123就是1111011.000101010011001100101001010010010101001……
注意:因为有效位数的关系,只能截取24位有效数据,误差就产生在这里
(对于第一位的1不存储,第0至第22位,放入11101100010101001100110,其他第23至31位都是表示的位移方向、位移长度、正负等)
当然因为是printf的关系,默认只有6位小数,其实还原到显示的值并不是123.123001