计算变更计划 - C.

时间:2015-03-11 19:41:22

标签: c casting

在尝试编写一个程序来计算用户的更改时,我遇到了一个特殊的问题。用户输入金额 - 以美元和美分 - 并且程序将计算用户将收到多少账单和硬币。

我有计算硬币部分的问题,因为我没有计算我期望计算的金额。

例如,用户输入123.45,因此我将123拉出并计算美元部分,然后拉出.45并计算硬币部分。

我觉得将浮点数转换为整数存在问题,但我不确定。如果我输入.45然后尝试打印它,程序将输出.449997

这里发生了什么?

#include <stdio.h>

void giveChange(float);
void countCents(float);

int main()
{
    float amount;

    printf("Enter in an amount (in dollars and cents): ");
    scanf("%f", &amount);

    giveChange(amount);

    getchar();
    return 0;
}

void giveChange(float amount)
{
    int newAmount = (int)amount;
    int hundreds, fifties, tens, fives, ones;
    float cents = amount - newAmount;

    hundreds = newAmount / 100;
    newAmount %= 100;

    fifties = newAmount / 50;
    newAmount %= 50;

    tens = newAmount / 10;
    newAmount %= 10;

    fives = newAmount / 5;
    newAmount %=  5;

    printf("\nHundreds: %i\nFifties: %i\nTens: %i\nFives: %i\nOnes: %i\n", hundreds, fifties, tens, fives, newAmount);

    countCents(cents);

    return; 
}

void countCents(float cents)
{
    int newCents = cents * 10;
    int quarters, dimes, nickels, pennies;

    quarters = newCents / 25;
    newCents %= 25;

    dimes = newCents / 10;
    newCents %= 10;

    nickels = newCents / 5;
    newCents %= 5;

    printf("\nQuarters: %i\nDimes: %i\nNickels: %i\nPennies: %i\n", quarters, nickels, dimes, newCents);

    return;
}

3 个答案:

答案 0 :(得分:3)

您正在使用浮点数据类型来表示定点计算。浮点运算会受到许多舍入误差的影响,例如您所见过的。

不使用floatdouble来表示美元和分数,而是使用代表美分总数的普通int。例如,不要使用float value = 4.25;作为4.25美元,而是使用int value = 425;(425美分)。然后,value/100== 4)是美元数(注意:整数除法被截断),value%100== 25)是便士数。

(这被称为&#39; fixed-point&#39;因为小数点位置在表示中是固定的(在这种情况下,它总是在两位小数之后)。定点算术是基本上是整数运算,后计算更正。)

答案 1 :(得分:2)

您无法使用浮点数表示更改。你需要将钱作为一个整数分(或十分之一分,百分之一分,并根据应用而言)。

尝试这样的事情。

#include <stdio.h>

int main (void)
{
  int dollars;
  int cents;

  scanf ("%d.%d", &dollars, &cents);

  printf ("%d dollars, %d cents\n", dollars, cents);

  return 0;
}

答案 2 :(得分:0)

长篇短篇小册子不能像整明一样工作,因此你无法用它们表达准确的数字。

请参阅here

尝试将输入乘以100,然后使用%100!