最低数量的硬币

问题描述

请找到以下问题上下文:

编写一个程序,该程序采用一个表示金额的浮点值,例如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...