编程新手。在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;
}
答案 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 long
或double
。每个都有short comings。对于学习者程序,从最小面额(美分)的宽整数类型开始。