double d = 1.2 - (long)1.2; d *= 10; printf("%d\n", (int)d);
面试时遇到这个问题,问输出是多少? 大多数人会立马回答输出是2,但实际上输出并不是凭空臆想的结果。 其实我们都知道,浮点数在计算机中只能近似表示,存在误差,计算机中根本不存在确切的0.0,即说明我们不能直接比较浮点数是否等于0.0,即
#include <stdio.h> int main(int argc, char **argv) { double d = (1.1 - 1.0) * 10 - 1; printf("%lf\n", d); /* d = 0.000000 */ if (d == 0) printf("true\n"); else printf("false\n"); return 0; }
会返回false! 而应该使用fabs(f1, f2) <= precision 进行比较,注意这个precision是绝对误差,当f1和f2在这个绝对误差附近时可能出现问题!所以开头那段程序的输出可能是2,也可能是1!