3

为什么会这样:

int main(void)
{
    short w = 30;
    return  1.2 * w;
}

返回 35?

4

7 回答 7

14

如果您想获得更合适的结果,请尝试以下操作:

return 12*w/10
于 2010-09-28T09:36:34.747 回答
12

1.2 * w36.0。它具有 double 类型,这意味着它没有被精确地表示。

可能结果是略小于3635.99999所以当你返回它时,小数部分被丢弃,只返回整数部分。你就是这样得到的35


PS 所有的浮点运算都不精确。你应该期待小的差异。此外,当您将浮点值与固定值进行比较时,不能进行直接比较,而应进行范围比较。

错误的:if (value == 36.0) { /* ... */ }

正确的:if (abs (value - 36.0) < 0.0001) { /* ... */ }

于 2010-09-28T09:28:23.377 回答
3

由于浮点数学可能不精确,round()请在转换为整数之前使用,以获得更好的结果。

#include <math.h>
...
return (int)round(some_real_value);
于 2010-09-28T16:35:08.753 回答
3

这是二进制浮点精度的问题。1.2非常略小于 1.2,所以乘法的结果略小于 36。

于 2010-09-28T09:29:17.307 回答
3

因为表示:1.2 真的是像 1.1999999

于 2010-09-28T09:29:44.413 回答
1

不要期望在浮点运算中得到绝对准确的结果。例如,乘法结果可能是 35.9999,四舍五入为 35。

于 2010-09-28T09:29:27.573 回答
0

短 w = 30; 返回 1.2 * w;

在 return 语句中,第一个排序值是 double 类型,因为 1.2 是 double 类型,所以它将乘以 1.2 * 30.000000,结果变为 35.999999 左右,函数返回类型是 int,所以小数部分被截断,它只返回 35。

于 2010-09-28T09:53:20.553 回答