为什么会这样:
int main(void)
{
short w = 30;
return 1.2 * w;
}
返回 35?
为什么会这样:
int main(void)
{
short w = 30;
return 1.2 * w;
}
返回 35?
如果您想获得更合适的结果,请尝试以下操作:
return 12*w/10
1.2 * w
是36.0
。它具有 double 类型,这意味着它没有被精确地表示。
可能结果是略小于36
,35.99999
所以当你返回它时,小数部分被丢弃,只返回整数部分。你就是这样得到的35
。
PS 所有的浮点运算都不精确。你应该期待小的差异。此外,当您将浮点值与固定值进行比较时,不能进行直接比较,而应进行范围比较。
错误的:if (value == 36.0) { /* ... */ }
正确的:if (abs (value - 36.0) < 0.0001) { /* ... */ }
由于浮点数学可能不精确,round()
请在转换为整数之前使用,以获得更好的结果。
#include <math.h>
...
return (int)round(some_real_value);
这是二进制浮点精度的问题。1.2
非常略小于 1.2,所以乘法的结果略小于 36。
因为表示:1.2 真的是像 1.1999999
不要期望在浮点运算中得到绝对准确的结果。例如,乘法结果可能是 35.9999,四舍五入为 35。
短 w = 30; 返回 1.2 * w;
在 return 语句中,第一个排序值是 double 类型,因为 1.2 是 double 类型,所以它将乘以 1.2 * 30.000000,结果变为 35.999999 左右,函数返回类型是 int,所以小数部分被截断,它只返回 35。