所以我正在为一门编程课程做一个作业,我遇到了一行代码问题。
答案应该是(如果我的数学是正确的)40但程序返回39。
例如: 18.33 * 40 * 52 = 38126.4
然后我使用此代码
double wage = 0;
wage = wage * 40 * 52;
wage = wage - floor(wage);
wage = wage * 100;
printf(" %d cents", (int)wage);
但该程序返回39.如果我不将其更改为int,则为40.0000000
发生了什么事?
答案 0 :(得分:4)
浮点数无法将每个实数表示为无限精度。 40.0
也不例外。相反,如果您的计算以正确且数字稳定的方式完成,您将获得double
可以代表的最接近的数字。
像printf
这样的函数通过考虑它们收到的操作数与给定数字的接近程度来使输出变得漂亮。
因此,您的结果可能是39.99998
,最接近的数字double
可以代表您的正确结果。它显示为40.0000000
。
然而,转换为int
执行截断。所以它变成了39
。
出于您的目的(您似乎在处理金钱),一种最有效的方法是完全摆脱浮点数。你只需要两个整数。一分为美分(仅增长到100分),一分为美元 1 。
1 由于代码中乘以100
,我假设美元和美分。当然它适用于任何货币