VC++ 2008 express 上的浮点乘法

Floating point multiplication on VC++ 2008 express

为什么是下面的片段

int i = 30;
int p = 0.7f * i;
printf("p is %d\n", p);

在 vc++ 2008 express 上给出 20 而不是 21? 我知道这是一个旧的编译器!

数字 0.7 在您的编译器用于 float 的基于二进制的浮点格式中不可表示。当十进制数“0.7”转换为float时,结果是最接近的可表示值。这是一个略低于 0.7 的数字。

将其乘以 30 得到略低于 21 的数字,将其转换为 int 并截断得到 20。