c中的混淆模数

Confusing modulo in c

我对 c 中的模数有点困惑。尝试以下示例:

double d = 4912;
int a;
a = (int) d%100;
printf ("%d \n", a);

答案是 12。好的,这正是我所期待的。现在我试试这个:

double d = 49.12;
d = d*100;
int a;
a = (int) d%100;
printf ("%d \n", a);

答案:12。再次如我所料。但是现在:

double d = 49.12;
int a;
a = (int)(d*100)%100;
printf ("%d \n", a);

答:11个!这绝对不是我所期望的。但我不知道为什么。 oO

double 作为 64 位浮点数不能表示编码为文本的每个数字。 In 可以编码大约 264 个不同的数字。 49.12 不是其中之一。

鉴于大多数 double 二进制 性质,最接近的 double d 值约为 49.119999999999997.

(int)(d*100)%100 的结果就是 11。


在另一个平台上,结果可能是12。