【发布时间】:2016-03-16 19:51:45
【问题描述】:
大家好,我正在用 c 语言编写一个程序,它会告诉您任何给定金额所需的最少硬币数量。我编写了一个程序,适用于我测试过的所有金额,除了 4.20 美元。
这是我的代码:
#include <cs50.h>
#include <stdio.h>
#include <math.h>
int main(void)
{
float f;
int n, x, y, z, q, s, d, t;
do {
printf("How much change do you need?\n");
f = GetFloat();
} while(f <= 0);
{
n = (f * 100);
}
q = (n / 25);
x = (n % 25);
y = (x / 10);
z = (x % 10);
s = (z / 5);
d = (z % 5);
t = (q + y + s + d);
{
printf("%d\n" ,t);
}
}
奇怪的是,当我输入 4.20 时,输出是 22 而不是 18(16 个四分之一和 2 个角钱)。我做了一些调查,发现问题出在我的变量 x 上。当我输入 4.2 时,x 给了我 19 而不是应该的 20。我尝试了其他我认为应该产生相同问题的案例,例如 5.2 和 1.2,但在这些案例中它可以正常工作。这可能是一个四舍五入的问题,但我认为这些相似的值也会发生同样的错误。
有人知道为什么会发生这种情况吗?
PS 我对编码还很陌生,而且我没有得到太多正式的指导,所以如果你看到任何明显的东西,我也欢迎关于更好的缩进和格式的提示。
【问题讨论】:
-
舍入错误,n大概是419。使用
n = round(f*100); -
float f;已经错了。如果您需要精确值,切勿使用浮点数!稍加努力,您就会发现这个问题已经在这里问过多次了。 -
变量名可以(几乎)任意长度。明智地使用它,给它们起描述性的名字!
-
@Olaf:当您需要从用户那里获得
float时,float没有任何问题(我认为这就是GetFloat函数返回的内容)。 OP 通过在早期转换为int做正确的事情,他们只是忘记考虑 IEEE 浮点不精确性,并且在转换为int美分之前没有四舍五入。 -
是的,可以使用
longDescriptiveName1, longDescriptiveName2, longDescriptiveName3... :)
标签: c floating-point cs50