为什么1.2*30 = 35?

Tho*_*ber 3 c floating-point floating-accuracy

为什么这样:

int main(void)
{
    short w = 30;
    return  1.2 * w;
}
Run Code Online (Sandbox Code Playgroud)

回35?

eci*_*cik 14

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

return 12*w/10
Run Code Online (Sandbox Code Playgroud)


小智 12

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

可能它稍微小于36,也许是35.99999这样,当你返回时,小数部分被丢弃,只返回整数部分.这就是你得到的35.


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

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

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

  • 请注意,`36.0`*可以*完全以浮点表示 - 但是`1.2`不能. (2认同)