【问题标题】:In C, I have a floating point variable decreasing by an incorrect amount在 C 中,我有一个浮点变量减少了不正确的数量
【发布时间】:2015-03-13 23:58:30
【问题描述】:

我正在用 C 语言编写一个程序来计算欠款。您应该输入一个值并收到一条消息,显示如下:“您的更改是:x 个季度,x 个角钱......”

系统通过 4 个“for”循环工作。每个检查变量 x 是否小于用户输入的值(钱)的值。如果是这样,则 x 增加一些硬币值(即 0.25),增加计算特定硬币的变量,并且用户输入的值减少一些硬币值。

问题是用户输入的值(存储在称为货币的浮点数中)减少了不正确的数量。 1 - 0.25 应该是 0.75,对吧?然而,出于某种原因,我的程序将“money”的值更改为 0.500000。

代码如下:

float money = 0.00;
int q = 0;
int d = 0;
int n = 0;
int p = 0;
float x = 0.00;

printf("Enter amount: ");
money = GetFloat(); // This function is part of a library called cs50.h

for (x = 0.00; x < money; (x = x + 0.25)) {
    q++;
    money = (money - 0.25); // This, and everything else like this, is the problem
}

for (x = 0; x < money; (x = x + 0.10)) {
    d++;
    money = (money - 0.10);
}

for (x = 0; x < money; (x = x + 0.05)) {
    n++;
    money = (money - 0.05);
}

for (x = 0; x < money; (x = x + 0.01)) {
    p++;
    money = (money - 0.01);
}

printf("Your change is: %i quarters, %i dimes, %i nickles, and %i pennies.\n", q, d, n, p);

【问题讨论】:

  • 您是否使用调试器单步调试过您的代码?如果您的回答不是“是”,那么请删除此问题,继续这样做,当您有真正的问题时再回来。
  • @JimLewis 虽然我完全同意你的观点,但当他期望 0.75 时,OP 得到了类似 0.500000 的值这一事实表明存在逻辑错误,而不是浮点精度问题。

标签: c variables cs50


【解决方案1】:

没有真正阅读您的故事,但 0.500 正是您的 for 循环产生的结果

for (x = 0.00; x < money; (x = x + 0.25)) {
    q++;
    money = (money - 0.25); // This, and everything else like this, is the     problem
}

假设钱是 1: 第一次迭代后:x 变为 0.25,money 变为 0.75 然后你有第二次迭代:x 变成 0.5,money 变成 0.5 在第二次迭代之后,你的循环就结束了。因此钱 = 0.5f

你所有的循环都有完全相同的问题。请记住,只有当条件 x

【讨论】:

  • 我不知道我怎么不早点明白这一点。谢谢。
【解决方案2】:

你确定你的循环是正确的吗?我认为您可能没有得到您的期望,因为循环的逻辑不正确。例如,如果 money = 1.00 开始,我认为第一个循环会产生以下结果。

x     q     money   x<money
0.00  1     0.75    1   
0.25  2     0.50    1
0.50  3     0.25    0 (exit loop)

【讨论】:

  • q 不会达到 3,money 不会达到 0.25
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
相关资源
最近更新 更多