2

我见过很多人提到过这个特定的 C 程序,尽管形式不同。但是,我似乎无法确定问题的根源,也无法找到其他有帮助的答案。程序编译,甚至执行正确,除了一个单一的输入:4.2

该程序似乎计算了将零钱输入为输入所需的最小硬币数量,4.2 除外。它输出 22 而不是应有的 18(16 个季度,2 个角钱)。有什么想法吗?我正在审核一门在线课程,没有学分/没有学术不诚实问题。

#include <stdio.h>
#include <cs50.h>

int main(void)
{ 

//quarters, dimes, nickels, and total number of coins. a is float input for exact change.

float a;
int q=0;
int d=0;
int n=0;
int p=0;
int i;

//petitioning input
do
  {
  printf("Hello, how much change do I owe you?\n");
  a = GetFloat();
  }
  while(a<=0);

//converting float a to an integer i
i= a*100;

//four 'while' loops checking quarters nickels dimes pennies and adding to coin count while
while(i>=25)
    {
    i=i-25;
    q++;
    }
while(i>=10 && i<25)
    {
    i=i-10;
    d++;
    }
while(i>=5 && i<10)
    {
    i=i-5;
    n++;
    }

while(i>0 && i<5)
    {
    i= i-1;
    p++;
    }

//printing sum of each coin type 
  {
  printf("%d\n", q+d+n+p);
  }
return 0;    
 }
4

3 回答 3

3

你只是被浮点精度伪造了。

你声明了

float a;

那么,当

a = 4.2; // say

它看起来像

a = 4.19999981

所以,i= a*100;被分配419i而不是420(你所期望的)。

解决方案您需要 浮点数 a转换为整数

(int)(x + 0.5)

所以,而不是i= a*100尝试

i= a*100 + .5;
于 2015-07-29T07:14:10.293 回答
2

许多数字不能用浮点数正确表示。4.2 可能存储为 4.19999999 或类似的东西。

从浮点数到整数的转换不正确,可能会导致舍入错误:

//converting float a to an integer i
i= a*100; 

在您的情况下,数字 4.2 变为 419 美分。

将其更改为:

//converting float a to an integer i
i= a*100 + 0.5f; 

欲了解更多信息,请阅读以下文章:

每个计算机科学家都应该知道的关于浮点运算的知识,David Goldberg

于 2015-07-29T07:12:55.057 回答
1

我不知道是什么,GetFloat()但您必须考虑将是的浮点4.2表示4.19999981。你可以测试它添加printf("a=%.8f", a);

然后,当您将浮点数“转换”为 int 时,i将是419.

计算硬币的代码运行良好,是您的输入不是您认为的那样。

可以帮助您更好地理解 float 到 int 的转换。

于 2015-07-29T07:13:18.147 回答