为什么1.2 * 30 = 35?

为什么这样:

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

回35?

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

 return 12*w/10 

1.2 * w36.0 。 它具有双重类型,意味着它没有完全表示。

可能它稍微小于36 ,可能是35.99999所以当你返回它时,小数部分被丢弃,只返回整数部分。 这就是你如何得到35


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

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

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

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

因为代表:1.2真的像1.1999999

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

 #include  ... return (int)round(some_real_value); 

不要指望在浮点运算中得到绝对精确的结果。 乘法结果可以是例如35.9999,其舍入为35。

短w = 30; 返回1.2 * w;

在return语句中,第一个排序值是double类型转换,因为1.2是double类型所以它将乘以1.2 * 30.000000并且结果变为大约35.999999并且函数返回类型是int因此小数部分是truncate并且它仅返回35。