在c中混淆模数

时间:2018-02-14 22:22:24

标签: c floating-point modulo

我对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

1 个答案:

答案 0 :(得分:4)

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

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

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

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