c - 为什么我的代码返回的数字低于应返回的数字?

标签 c debugging casting math.h

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

答案应该是(如果我的数学是正确的)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

发生了什么事?

最佳答案

float 无法无限精确地表示每个实数。 40.0 也不异常(exception)。相反,如果您的计算以正确且数值稳定的方式完成,您将获得 double 可以表示的最接近的数字。

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

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

然而,转换为 int 会执行截断。所以它变成了 39

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

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

关于c - 为什么我的代码返回的数字低于应返回的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41671720/

相关文章:

c - c中链表中的头节点

c - GDB 停留在 “Configuring GDB Aborting configuring GDB”

php - 从 $.post() 获取数组

转换为 (char) 并分配给 (int) 不会清除 MSB

c# - 如何使用空检查优化一系列 as-operations?

c - 如何在 c 中将 4 的 uint8_t 数组转换为 uint32_t

c - C 中的链表

C - 以某种密度填充矩阵

debugging - 如何调试内核死锁问题

java - Eclipse远程调试,看不到对象的属性