这是我写的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
double num;
int tmp;
printf("enter a number!\n");
scanf("%lf",&num);
tmp=num*10000;
printf(" temp=%d\n",tmp);
return 0;
}
当我输入数字1441.1441时,我得到的结果是14411440,而不是
14411441这显然是将我的输入数字乘以10000后的正确结果。有人可以帮我解决这个问题吗?
最佳答案
由于绝大多数实数实际上无法准确表示,因此您可能会发现1441.1441
实际上存储为1441.14409999_blah_blah_blah
之类的东西。您可以通过插入以下内容找到答案:
printf ("%.50lf\n", num);
在
scanf
之后立即看到(删除了零位跟踪):1441.14409999999998035491444170475006103515625
现在,根据您的输入,这实际上是正确的(即最接近的)值。从那里开始的下一个最高编号为您提供:
1441.144100000000207728589884936809539794921875
第一个值的错误是:
0.00000000000001964508555829524993896484375
^ ~ 2 x 10^-14
而第二个错误是:
0.000000000000207728589884936809539794921875
^ ~ 2 x 10^-13
您会发现后者的错误大约是错误的10倍。
当您将其乘以
10000
并尝试将其拔角成为int
时,它会四舍五入(截断)。这是因为(C11)标准在6.3.1.4
中有这样的说法:您可以尝试的一件事是将鞋拔线更改为:
tmp = num * 10000 + 0.5;
有效地将截断变成舍入运算。我认为这适用于所有情况,但您可能需要对其进行测试(并留意)以防万一。
关于c - C中的数字精度错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13525376/