这是我写的代码:

#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/

10-10 20:30