为什么我的代码 return 的数字低于它应该 return 的数字?

Why is my code returning a number lower than what it should return?

所以我正在为一门编程课程做作业,但我的一行代码遇到了问题。

答案应该是(如果我的数学是正确的)40 但程序 returns 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);

但是程序returns39.如果我不把它改成int就是40.0000000

发生了什么事?

浮点数无法无限精确地表示每个实数。 40.0也不例外。相反,如果您的计算以正确且数值稳定的方式进行,您将得到最接近的数字 double 可以表示。

printf 这样的函数通过考虑它们接收到的操作数与给定数字的接近程度来使输出更漂亮。

因此您的结果可能是 39.99998,最接近的数字 double 可以代表您的正确结果。并且显示为40.0000000.

但是转换为 int 会执行截断。于是就变成了39.

出于您的目的(您似乎是在进行货币交易),最有效的方法是完全摆脱浮点数。你只需要两个整数。一个是美分(最多只能增长到 100),一个是美元1.

1 我假设是美元和美分,因为在您的代码中乘以 100。当然它适用于任何货币