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