我正在使用 sscanf 从文本文件中读取一些值,并使用 %lf 将它们存储为加倍。
但值正在四舍五入。例如
读取内容:5.655035220-E02 存储内容:0.0565504
我认为这与格式说明符“%lf”有关。
请按原样建议正确的格式说明符来读取和存储值。
我正在使用 sscanf 从文本文件中读取一些值,并使用 %lf 将它们存储为加倍。
但值正在四舍五入。例如
读取内容:5.655035220-E02 存储内容:0.0565504
我认为这与格式说明符“%lf”有关。
请按原样建议正确的格式说明符来读取和存储值。
您的意思是您已经编写了这样的代码(感谢您下次提供您的代码,顺便说一句,它确实有助于理解发生了什么,而不必依赖模糊的线索):
#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
你有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
看看这段代码,
double tt= 5.655035220e-02;
printf("%le",tt);
getchar();
解决方案与 IAM HERE 的帖子相同。问题是您将值写为 5.6...20-e02 但它应该是 5.6...20e-02 (注意,- 在 E 之后,而不是之前!)。