【问题标题】:CS50 Pset1/Cash. While loop doesn't recognize equalityCS50 Pset1/现金。虽然循环不承认平等
【发布时间】:2021-08-02 22:18:00
【问题描述】:

我在获取 pset1/cash 的正确解决方案时遇到了一些麻烦。当我当前的“欠款”值等于硬币面额值时,while 循环似乎无法识别。例如,这是我的 10 美分代码(我添加了不断打印的值以帮助诊断):

printf("%f\n", change);
printf("%i\n", coins);

while (change >= 0.100000)
{
    change -= 0.10;
    coins++;
}
printf("%f\n", change);
printf("%i\n", coins);

while (change >= 0.0500000)
{
    change -= 0.05;
    coins++;
}
printf("%f\n", change);
printf("%i\n", coins);

这是这些段的输出:

0.200000
16
0.100000
17
0.050000
18

所以我们还剩下 0.200000 作为所欠的零钱,因此它正确地检测到该值 >= .100000,从当前值中减去 0.10 并将硬币计数器加 1。但是,它没有认识到 .100000 的下一个当前值等于 while 循环中规定的 0.100000,而是继续下一个 while 循环并正确检测到确实是 .100000 >= .05 并减去 .05。为什么 while 循环不能识别 .100000 >= .100000 为 True?

我尝试在 while 循环中添加和减去 0 以尝试让它识别这个事实。

谢谢!

【问题讨论】:

    标签: while-loop cs50


    【解决方案1】:

    注意规范中的警告:

    • 请注意浮点值固有的不精确性。回忆一下课堂上的floats.c,其中,如果x2,而y10x / y 不正好是十分之二!因此,在进行更改之前,您可能希望将用户输入的美元转换为美分(即,从 float 转换为 int)以避免可能加起来的微小错误!

    • 注意将您的美分四舍五入到最接近的一美分,就像在math.h 中声明的round 一样。例如,如果dollars 是带有用户输入的float(例如,0.20),则代码如下

        int cents = round(dollars * 100);
      

      将安全地将0.20(甚至0.200000002980232238769531250)转换为20

    【讨论】:

    • 谢谢!我应该完整阅读说明。
    • 第一个 pset 是该课的最佳时间!
    猜你喜欢
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    相关资源
    最近更新 更多