首先要明确一点,不是所有的有限位十进制小数都可以转化成有限位的二进制小数,浮点数储存的二进制数只是最接近原十进制小数的一个二进制小数。这也就是一切精度问题的根源
比如0.1,直接化二进制会得到一个无限循环的二进制小数0.000110011000110011……
C语言遵从IEEE 754浮点数标准
具体见
http://en.wikipedia.org/wiki/IEEE_floating_point
这儿你说到的是float,也就是单精度浮点数,具体内容见
http://en.wikipedia.org/wiki/Single_precision_floating-point_format
简单解释一下,IEEE 754规定的一个单精度浮点数占32个bit
这32个bit如图分配
第一位是符号位,后面八位是exponent位,在后面23位fraction位
最后的值是根据公式
来求
-100.12根据IEEE754表示成二进制是
1 10000101 10010000011110101110001
求值就是
(-1)x(1.10010000011110101110001)x10^(10000101-01111111)
这个你计算一下很容易得出这个二进制小数表示的十进制数的准确值是
-1100100.00011110101110001 = -100.12000274658203125
%f的默认输出精度是六位小数,所以最后的结果是0.120003就很好理解了
这是精度问题float的精度是小数点后六位;
-100.12在只算中要以二进制的补码进行计算的;
负数要转码成反码在又反码变成补码进行计算的;
要得到输出的数还要把这些码转回来;
我也是这样吧、听力一点点要知道原因还是要你自己懂二进制的;
我自能帮你这些了,因为我也只知道这些希望对你有用。
在c语言中,float 类型和 double类型 是不能保证有效存储数据的
存储的数据会有小小的误差
这是float型,你要想输出0.12还得在"%后输入个什么.什么,具体我忘了,你自己查查