我正在使用sscanf从文本文件中读取一些值,并使用%lf将它们存储为double。
但价值正在变得圆滑。例如
阅读内容:5.655035220-E02 存储的内容:0.0565504
我认为它与格式说明符“%lf”有关。
请建议正确的格式说明符,以便读取和存储值。
答案 0 :(得分: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
答案 1 :(得分:1)
看一下这段代码,
double tt= 5.655035220e-02;
printf("%le",tt);
getchar();
答案 2 :(得分: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
如果使用类型float
而不是double
,则在典型的4字节浮点中,5.655035220e-02
为5.65503537...e-02
时,您可能会遇到精度损失。
推荐@devnull关于阅读每个计算机科学家应该知道的关于浮点运算的想法。 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
答案 3 :(得分:0)
解决方案与IAM HERE的帖子相同。问题是您将值写为5.6 ... 20-e02但它应该是5.6 ... 20e-02(注意, - 在E之后,而不是之前!)。