关于#C语言#的问题,如何解决?

C语言问题

代码 #include <stdio.h>
void main
{
double a,b,c;
int d;
b=3.3;
c=1.1;
a=b/c;
d=b/c;
printf("%f,%d",a,d);
if (3.0!=a);
printf("\nreally? 3.0!=a");
}

结果 3.000000,2
really? 3.0!=a

求a和d的值,问为什么结果不一样

#include<stdio.h>
void main()
{
  double a,b,c;   
  int d;
  b=3.3;
  c=1.1;//初始值。 
  a=b/c;//a=3.3/1.1=3.0
  d=b/c;//d=3.3/1.1=3
  printf("%f,%d",a,d);
  //这里要用%lf
  //理论输出值 应为3.000000, 3
  if(3.0!=a)
     printf("\nreally? 3.0!=a");
  return 0;
}

如果输出实际d值为2,
那么唯一的可能就是浮点数精度问题。
3.3/1.1得到3.0 实际上被存成了2.99999...
这样一个接近3的近似值。 然后转为整型时,取整数部分为3。

希望对题主有所帮助,可以的话,帮忙点个采纳!

  1. a是double型,小数点后并不是全0;3.0是float型,自然a != 3.0
  2. d是整型,除法结果会默认转换为整型,3.3 / 1.1 结果计算上来看是3,但是计算机算出来可能是2.9999999,而整型向下取整,就为2了;

浮点数在计算机底层的存储逻辑可以百度一下:
然后,要知道d定义为int类型,计算机里可没有四舍五入之说,而是直接取整数位,即即使d为2.9,也当成2

img

涉及到就是double类型的计算以及double类型的比较技巧:
可以参考:

//差值在自己能接受的一个误差范围内就好
bool equal(double a,double b){
    return fabs(a-b)<0.000001;
}