3

我正在使用 sscanf 从文本文件中读取一些值,并使用 %lf 将它们存储为加倍。

但值正在四舍五入。例如

读取内容:5.655035220-E02 存储内容:0.0565504

我认为这与格式说明符“%lf”有关。

请按原样建议正确的格式说明符来读取和存储值。

4

4 回答 4

3

您的意思是您已经编写了这样的代码(感谢您下次提供您的代码,顺便说一句,它确实有助于理解发生了什么,而不必依赖模糊的线索):

#include <stdio.h>

int main(){
  double v2;
  sscanf("5.655035220e-02", "%lf", &v2);
  printf("%f\n", v2);
  return 0;
}

你会得到如下结果:

0.056550

(给出或取一个十进制数字。)

您的问题不sscanf()在于printf(). 变量v2包含您扫描的数字的良好近似值。您根本不要求printf()打印此近似值的许多数字。尝试:

printf("%.10f\n", v2);
0.0565503522
于 2013-05-30T12:23:16.740 回答
1

你有2个问题

您的printf()说明符舍入了太多位
(也许)您的浮点变量无法保留所有所需的精度。

建议的格式说明符:
阅读:sscanf(buffer, "%le", &d)
存储:printf("%.*le", DECIMAL_DIG /* or DBL_DIG+3 */, d)


问题 1

double d;
sscanf("5.655035220e-02", "%lf", &d);
printf("%.7lf\n", d);  // 0.0565504
printf("%.7le\n", d);  // 5.6550352e-02
printf("%.9le\n", d);  // 5.655035220e-02

如果您使用 打印出来%e,它们将是更重要的数字,而不是%f带有前导零数字的 。您看到的数字是一个四舍五入的值。不是存储数字是 5.65503522000000008...e-02


问题 2

如果您使用 type float,而不是double,您可能会遇到典型的 4 字节浮点5.655035220e-02中的精度损失。5.65503537...e-02


推荐上面的@devnull 想法关于阅读每个计算机科学家应该知道的关于浮点运算的知识http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

于 2013-06-02T02:16:24.740 回答
1

看看这段代码,

double tt=  5.655035220e-02;
printf("%le",tt);
getchar();
于 2013-05-30T09:09:22.550 回答
0

解决方案与 IAM HERE 的帖子相同。问题是您将值写为 5.6...20-e02 但它应该是 5.6...20e-02 (注意,- 在 E 之后,而不是之前!)。

于 2013-05-31T09:03:52.857 回答