为什么我的最后一个部门没有被执行?
Why my last divison is not being executed?
这是CS50的问题1现金的代码:
#include <stdio.h>
#include <math.h>
#include <cs50.h>
int main(void) {
double d;
int coins = 0;
do {
d = get_float("Change owed: ");
} while(d < 0);
for (int i = 0; i <= 5; i++) {
if (d == 0) break;
if (d >= 0.25) {
coins += d / 0.25;
d = fmod(d, 0.25);
printf("\nd0: %f\n", d);
printf("coins0: %d\n\n", coins);
}
else if (d >= 0.10) {
coins += d / 0.1;
d = fmod(d, 0.1);
printf("\nd1: %f\n", d);
printf("coins1: %d\n\n", coins);
}
else if (d >= 0.05) {
coins += d / 0.05;
d = fmod(d, 0.05);
printf("\nd2: %f\n", d);
printf("coins2: %d\n\n", coins);
}
else if (d >= 0.01) {
coins += d / 0.01;
d = fmod(d, 0.01);
printf("\nd3: %f\n", d);
printf("coins3: %d\n\n", coins);
}
}
printf("coins: %d\n\n", coins);
}
当我尝试获取至少需要一分钱的硬币总数时,除法不会发生,因此硬币数不会增加。那么,为什么?
浮点数可能总是会导致这类问题,这里的解决方案是给你的浮点数一个范围。例如,不要查找 if x>0.01,而是查找 x>(0.01-0.000001)
虽然使用浮点数总是使用范围,但永远不要寻找特定数字。
Why my last division is not being executed?
由于 OP ,d
小于 0.01,所以 d >= 0.01
不正确。
这是因为像 0.05 这样的浮点值是 dyadic rationals,而不是 10 的幂的倍数,而不是 正好 0.05。
相反,避免用钱累积舍入误差。考虑使用最小货币单位的整数,比如 0.01 和 long
或 long long
.
类型
读取浮点值,缩放到美分和四舍五入。
// double d;
long d_cents;
...
do {
//d = get_float("Change owed: ");
d_cents= lround(100.0 * get_float("Change owed: "));
} while(d_cents < 0);
相应地缩放数学。
//else if (d >= 0.05) {
// coins += d / 0.05;
// d = fmod(d, 0.05);
// printf("\nd2: %f\n", d);
// printf("coins2: %d\n\n", coins);
//}
else if (d_cents >= 5) {
coins += d_cents / 5;
d_cents %= 5;
printf("\nd2: %0.2f\n", d_cents/100.0);
printf("coins2: %d\n\n", coins);
}
这是CS50的问题1现金的代码:
#include <stdio.h>
#include <math.h>
#include <cs50.h>
int main(void) {
double d;
int coins = 0;
do {
d = get_float("Change owed: ");
} while(d < 0);
for (int i = 0; i <= 5; i++) {
if (d == 0) break;
if (d >= 0.25) {
coins += d / 0.25;
d = fmod(d, 0.25);
printf("\nd0: %f\n", d);
printf("coins0: %d\n\n", coins);
}
else if (d >= 0.10) {
coins += d / 0.1;
d = fmod(d, 0.1);
printf("\nd1: %f\n", d);
printf("coins1: %d\n\n", coins);
}
else if (d >= 0.05) {
coins += d / 0.05;
d = fmod(d, 0.05);
printf("\nd2: %f\n", d);
printf("coins2: %d\n\n", coins);
}
else if (d >= 0.01) {
coins += d / 0.01;
d = fmod(d, 0.01);
printf("\nd3: %f\n", d);
printf("coins3: %d\n\n", coins);
}
}
printf("coins: %d\n\n", coins);
}
当我尝试获取至少需要一分钱的硬币总数时,除法不会发生,因此硬币数不会增加。那么,为什么?
浮点数可能总是会导致这类问题,这里的解决方案是给你的浮点数一个范围。例如,不要查找 if x>0.01,而是查找 x>(0.01-0.000001)
虽然使用浮点数总是使用范围,但永远不要寻找特定数字。
Why my last division is not being executed?
由于 OP d
小于 0.01,所以 d >= 0.01
不正确。
这是因为像 0.05 这样的浮点值是 dyadic rationals,而不是 10 的幂的倍数,而不是 正好 0.05。
相反,避免用钱累积舍入误差。考虑使用最小货币单位的整数,比如 0.01 和 long
或 long long
.
读取浮点值,缩放到美分和四舍五入。
// double d;
long d_cents;
...
do {
//d = get_float("Change owed: ");
d_cents= lround(100.0 * get_float("Change owed: "));
} while(d_cents < 0);
相应地缩放数学。
//else if (d >= 0.05) {
// coins += d / 0.05;
// d = fmod(d, 0.05);
// printf("\nd2: %f\n", d);
// printf("coins2: %d\n\n", coins);
//}
else if (d_cents >= 5) {
coins += d_cents / 5;
d_cents %= 5;
printf("\nd2: %0.2f\n", d_cents/100.0);
printf("coins2: %d\n\n", coins);
}