CS50 Pset1/Cash。 while 循环不识别相等性
CS50 Pset1/Cash. While loop doesn't recognize equality
我在获得 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
所以我们还剩下 .200000 作为欠找零,所以它正确地检测到这个值 >= .100000,从当前值中减去 .10 并将硬币计数器加 1。但是,它并没有认识到 .100000 的下一个当前值等于 while 循环中规定的 .100000,而是继续进行下一个 while 循环并正确检测到确实 .100000 >= .05 并减去 .05。为什么 while 循环无法识别 .100000 >= .100000 为真?
我已经尝试在 while 循环中添加和减去 0 以尝试让它识别这个事实。
谢谢!
注意规范中的警告:
注意浮点值固有的不精确性。从class回忆floats.c
,其中,如果x
是2
,而y
是10
,x / y
不正好是两个十分之一!因此,在进行更改之前,您可能希望将用户输入的美元转换为美分(即,从 float
转换为 int
)以避免可能累积的微小错误!
注意将美分四舍五入到最接近的便士,就像 round
一样,它在 math.h
中声明。例如,如果 dollars
是带有用户输入的 float
(例如,0.20
),那么代码如下
int cents = round(dollars * 100);
将安全地将 0.20
(甚至 0.200000002980232238769531250
)转换为 20
。
我在获得 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
所以我们还剩下 .200000 作为欠找零,所以它正确地检测到这个值 >= .100000,从当前值中减去 .10 并将硬币计数器加 1。但是,它并没有认识到 .100000 的下一个当前值等于 while 循环中规定的 .100000,而是继续进行下一个 while 循环并正确检测到确实 .100000 >= .05 并减去 .05。为什么 while 循环无法识别 .100000 >= .100000 为真?
我已经尝试在 while 循环中添加和减去 0 以尝试让它识别这个事实。
谢谢!
注意规范中的警告:
注意浮点值固有的不精确性。从class回忆
floats.c
,其中,如果x
是2
,而y
是10
,x / y
不正好是两个十分之一!因此,在进行更改之前,您可能希望将用户输入的美元转换为美分(即,从float
转换为int
)以避免可能累积的微小错误!注意将美分四舍五入到最接近的便士,就像
round
一样,它在math.h
中声明。例如,如果dollars
是带有用户输入的float
(例如,0.20
),那么代码如下int cents = round(dollars * 100);
将安全地将
0.20
(甚至0.200000002980232238769531250
)转换为20
。