C语言的小问题,求助求助啊
c语言吧
全部回复
仅看楼主
level 11
#include <stdio.h>
int main(void) {
double a = 62.34;
double c = 64.88;
double d = c - a;
int b = c - a;
int decimal_part = (double)((d - b) * 100);
printf("%d %d\n", b, decimal_part);
return 0;
}
为什么decimal_part的值是53呢,不应该是54吗?I
2013年10月07日 03点10分 1
level 9
浮点数又来了……快跑
2013年10月07日 04点10分 3
[泪][泪][泪]I
2013年10月07日 04点10分
level 11
这个解释起来还真是麻烦。需要你了解计算机中浮点数的表示方式。由于计算机以2进制存储数据,
所以小数用2进制存储的时候,就变得非常麻烦。
我们知道:
1/2 = 0.5
1/4 =0.25
1/8=0.125
1/16=0.0625
1/32=0.03125
1/64=0.015625 .....
以小数点为分界线,从左向右,每一个2进制的位,就代表上面依次向下的计算结果。
比如小数点后面的2进制数为1101
就表示0.5+0.25+0+0.0625 = 0.8125
相反,我们把0.8125这个数化成2进制表示时,就需要这样计算
先确定第1位上的2进制数是1还是0,由于0.8>0.5,所以确定是1
然后0.8125-0.5=0.3125
再确定第2位上的2进制数是1还是0,由于0.3>0.25,所以确定是1
然后0.3125-0.25=0.0625
然后确定第3位上的数字是1还是0,由于0.0625<0.125,所以确定是0
再确定第4位上的数字是, 由于0.0625正好等1/16,所以确定是1,
再次相减后为0,小数表示完成,就是1101
以你的例子:d-b=0.54000
化为2进制数就是10001010001.....
用2进制表示,是一个非常长的1,0组成的串,我没算到底,不过可以确定,是一个很长的数。
然而计算机保存double型数据使用的8byte,也就是64bit, 而且这64bit没有完全使用上,还有符号位等,也就是说,计算机并没有完全的把0.54这个数字完整的用2进制数字表示出来。基本上可以确定是<0.54的,也就是0.539......
所以,当x100,时变成了53.9.....
而用int时,取整,截断了小数点后面的数据,所以变成了53I
2013年10月07日 05点10分 4
[真棒]
2013年10月07日 06点10分
level 11
浮点数很淘气的
2013年10月07日 06点10分 5
1