问题描述
请找到以下问题上下文:
编写一个程序,该程序采用一个表示金额的浮点值,例如2.8表示2美元和80美分。然后,程序应显示偿还硬币金额所需的最小硬币数量。假设用户输入的值大于0且小于10。
#include <stdio.h>
int main(void) {
double amt;
printf("Enter amount:");
scanf("%lf",&amt);
int amt_cents;
amt_cents = amt * 100;
int dollar_1;
dollar_1 = amt_cents / 100;
amt_cents = amt_cents - (dollar_1 * 100);
int cents_50;
cents_50 = amt_cents / 50;
amt_cents = amt_cents - (cents_50 * 50);
int cents_20;
cents_20 = amt_cents / 20;
amt_cents = amt_cents - (cents_20 * 20);
int cents_10;
cents_10 = amt_cents / 10;
amt_cents = amt_cents - (cents_10 * 10);
int cents_05;
cents_05 = amt_cents / 5;
amt_cents = amt_cents - (cents_05 * 5);
int cents_01;
cents_01 = amt_cents / 1;
amt_cents = amt_cents - (cents_01 * 1);
if (dollar_1 != 0) {
printf("Number of 1$: %d\n",dollar_1);
}
if (cents_50 != 0) {
printf("Number of 50c: %d\n",cents_50);
}
if (cents_20 != 0) {
printf("Number of 20c: %d\n",cents_20);
}
if (cents_10 != 0) {
printf("Number of 10c: %d\n",cents_10);
}
if (cents_05 != 0) {
printf("Number of 5c: %d\n",cents_05);
}
if (cents_01 != 0) {
printf("Number of 1c: %d\n",cents_01);
}
}
输出:
输入金额:1.1 1 $的数量:1 10c的个数:1
输入金额:2.1 1 $的数量:2 10c的个数:1
输入金额:3.1 1 $的数量:3 10c的个数:1
输入金额:4.1 1 $的数量:4 5c数:1 1c的数量:4
输入金额:5.1 1 $的数量:5 5c数:1 1c的数量:4
输入金额:6.1 1 $的数量:6 10c的个数:1
问题: 为什么4.1和5.1的值与0-10内的所有其他值相比有不同的作用? 通过手动计算代码,可以看出4.1和5.1应该与所有其他情况保持一致,即10c的值仅为1,但是程序执行时并非如此。
解决方法
为什么4.1和5.1的值与0-10之间的所有其他值相比工作方式不同?
因为浮点数并不总是精确地表示值。看这段代码:
double amt;
printf("Enter amount:");
scanf("%lf",&amt);
int amt_cents;
amt_cents = amt * 100;
如果您在最后一行之后设置一个断点并检查amt_cents
的值,您可能会发现它是409
而不是您期望的410
,因为{{1 }}类似于amt
。
您需要将数字四舍五入到最接近的整数,而不仅仅是整数部分,一种简单的方法是将值加0.5,然后然后截断:>
4.09999999...