减去一个浮点数

时间:2015-09-22 07:28:31

标签: c++ c

这个程序必须计算最小数量的硬币,但它有某种bug,因为结果很奇怪。这可能是明显的错误,但我找不到它。

int main(int argc,char* argv[]){
      float x;
      printf("How much cash in float number:");
      scanf("%f", &x);

      int quaters;
      while(x>=0.25){
        x-=0.25;
        quaters++;
      }
      printf("%f\n",x);

      int fives;
      while (x>=0.05){
        x-=0.05;
        fives++;
      }
       printf("%f\n",x);

      int one;
      while (x>=0.01){
        x-=0.01;
        one++;
      }
       printf("%f\n",x);
      printf("quaters %d\t fives %d\t ones %d\n", quaters, fives, one);
      return 0;
    }

输出就是这个

    How much cash in float number:0.41
0.160000
0.010000
0.010000
quaters 1    fives 3     ones 32764

出了什么问题?

4 个答案:

答案 0 :(得分:0)

在使用之前,您需要将quatersfivesone初始化为0:

int quaters=0;
....
int fives=0;
....
int one=0;
....

关于最后的0.01结果,谷歌“比较浮动变量C ++”。即使在这里你也会找到很多相关的帖子。

要立即解决,因为您在小数点后最多使用2位数,请从

更改float比较
x>=0.25

x>0.249

所有其他人都相应地:

x>0.049

x>0.009

答案 1 :(得分:0)

int quaters;
int fives;
int one;

quaters fivesone未初始化会导致未定义的行为

答案 2 :(得分:0)

quarterfiveone未正式注册。将它们初始化为0

同样在比较中 -

  while(x>=0.25){        // x is float and 0.25 is double 
    x-=0.25;

你不应该像这样比较浮点数。

答案 3 :(得分:0)

尝试使用较小的值进行比较以隐藏错误。我在这里使用EPS作为小值。

  • a>b - > a>b+EPS
  • a>=b - > a+EPS>b
  • a==b - &gt; fabs(a-b)<EPSfabs位于math.h

另外,不要忘记初始化变量!

#include <stdio.h>

#define EPS (1e-9)

int main(int argc,char* argv[]){
    float x;
    printf("How much cash in float number:");
    scanf("%f", &x);

    int quaters=0;
    while(x+EPS>0.25){
        x-=0.25;
        quaters++;
    }
    printf("%f\n",x);

    int fives=0;
    while (x+EPS>0.05){
        x-=0.05;
        fives++;
    }
    printf("%f\n",x);

    int one=0;
    while (x+EPS>0.01){
        x-=0.01;
        one++;
    }
    printf("%f\n",x);
    printf("quaters %d\t fives %d\t ones %d\n", quaters, fives, one);
    return 0;
}