如何将美分与美元数量隔离开来?

时间:2017-01-17 03:23:35

标签: c

编程新手。在C学习课程。以下是我试图制作的节目“你的小时工资是多少?”然后读取dollar.cent金额并计算工资。然后打印工资表格,“你一年的总收入是X美元和Y美分。

为了将美元与dollar.cent数量隔离,我通过从double转换为int来截断该值。我不知道如何获得分数,所以我想我可以从dollar.cents(* 100)中减去美元,而且我有分数。

我运行该程序并且工作正常,但我没有得到我期望的分数。

如果用户输入18.33作为小时工资。然后我得到31826美元总额,31836.40总收入。但是当我减去它们并乘以100时,我得到39美分而不是40美分。

int main(void) {

double totalIncome       = 0.0;
int totalDollars         = 0;
int totalCents           = 0;
double hourlyWage        = 0.0;
int hoursPerWeek         = 40;
const int WEEKS_PER_YEAR = 52;

printf("What is your hourly wage? ");
scanf("%lf", &hourlyWage);

totalIncome = hourlyWage * hoursPerWeek * WEEKS_PER_YEAR;
totalDollars = totalIncome; //converts to int from double
totalCents = 10 * (totalIncome - totalDollars);

printf("Your total income over a year is %d dollars and %d cents", totalDollars, totalCents);

return 0;

}

2 个答案:

答案 0 :(得分:4)

问题是100*(totalIncome - totalDollars)不是40,而是3.999999999941792e+01,因此将它转换为int会产生39.这是一个很好的例子,为什么不应该使用浮点进行计算与货币。

顺便说一句:你可以简单地使用像这样的东西来避免这个问题 scanf("%d.%d", &hourlyDollars, &hourlyCents);

答案 1 :(得分:1)

要将浮动点数浮动到浮点数到最接近的整数,请使用round()rint()

double x;
double cents = rint(x * 100.0);

要将浮动点数转换为最接近的整数美分,请使用lround()llround()

long long cents = llround(x * 100.0);

将FP美元分成全部美元和全部美分,按比例缩放,然后分开。

double x;
double cents = rint(x * 100.0);
double cent =  fmod(cents, 100.0);
double dollar = (cents - cent)/100;

避免混合类型以支持金钱。使用long longdouble。每个都有short comings。对于学习者程序,从最小面额(美分)的宽整数类型开始。