在尝试编写一个程序来计算用户的更改时,我遇到了一个特殊的问题。用户输入金额 - 以美元和美分 - 并且程序将计算用户将收到多少账单和硬币。
我有计算硬币部分的问题,因为我没有计算我期望计算的金额。
例如,用户输入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;
}
答案 0 :(得分:3)
您正在使用浮点数据类型来表示定点计算。浮点运算会受到许多舍入误差的影响,例如您所见过的。
不使用float
或double
来表示美元和分数,而是使用代表美分总数的普通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, ¢s);
printf ("%d dollars, %d cents\n", dollars, cents);
return 0;
}
答案 2 :(得分:0)