当我输入0.50
或其他可以除以0.25
的浮点数时,我不会出现任何错误,但是当我输入0.10
或其他不能除以的浮点数时我写的0.25
else
if语句没有发生。谁能告诉我为什么?
#include <cs50.h>
#include <stdio.h>
#include <math.h>
int main(void) {
float change;
do {
change = get_float("Change owed: ");
} while (change < 0.009);
int count = 0;
int div = 0;
while (change > 0.00) {
if ((change / 0.25) >= 1.00) {
div = round(change / 0.25);
count += div;
change = change - (div *0.25);
} else
if ((change / 0.10) >= 1.00) {
div = round(change / 0.10);
count += div;
change = change - (div * 0.10);
} else
if ((change / 0.05) >= 1.00) {
div = round(change / 0.05);
count += div;
change = change - (div * 0.05);
} else {
div = round(change / 0.01);
count += div;
change = change - (div * 0.01);
}
}
printf("%i\n", count);
}
答案 0 :(得分:6)
浮点数C的内部表示几乎总是IEEE 754 binary representations中指定的二进制格式,而不是十进制形式。结果,一些数字用简单的十进制表示法表示,例如0.1
,而不是精确地表示在float
或什至double
变量中。将此变量乘以10
不一定会精确地得到值1
,而是一个非常接近的浮点数,它不同于1
。比较浮点数时应格外小心,应考虑到舍入方法的传播会产生小的差异。特别是,在精确的美分很重要的情况下,应避免对货币值使用float
或double
:使用一个整数,该整数应具有足够大的美分数量来处理计算所得的数字。普通的32位int
不足以美分表示的大于2000万美元的数字。
以下是使用long int
的修改版本,至少32位大小:
#include <cs50.h>
#include <stdio.h>
#include <math.h>
int main(void) {
float change = get_float("Change owed: ");
long int cents = round(change * 100); // get an exact number of cents.
long int count = cents / 25; // number of quarters
cents %= 25;
count += cents / 10; // number of dimes
cents %= 10;
count += cents / 5; // number of nickels
cents %= 5;
count += cents; // number of pennies
printf("%ld coins\n", count);
return 0;
}