C 将字符串转换为double,答案是正确的,但不是很准确

C 将字符串转换为double,答案是正确的,但不是很准确,c,atof,C,Atof,我想使用atof将字符串转换为双精度,答案是正确的,但不是很准确 注意:由于其他原因,不允许使用fscanf 我的代码是: #include <stdio.h> #include <stdlib.h> #define MAXCN 50 int main(void) { FILE* lstm_txt = NULL; char lstm_weight[MAXCN] = {0}; int lstm = 0; int i = 0; float

我想使用atof将字符串转换为双精度,答案是正确的,但不是很准确

注意:由于其他原因,不允许使用fscanf

我的代码是:

#include <stdio.h>
#include <stdlib.h>
#define MAXCN 50

int main(void)
{   FILE* lstm_txt = NULL;
    char lstm_weight[MAXCN] = {0};
    int lstm = 0;
    int i = 0;
    float lstm_val;
    
    if ((lstm_txt = fopen("test1.txt", "r"))== NULL){
        fprintf(stderr,"error:file open failed 'test1.txt'.\n");
        return 1;
    }
    while ((i + 1 < MAXCN) && ((lstm = fgetc(lstm_txt)) != ' ' ) && (lstm != EOF)){
        lstm_weight[i++] = lstm;
    }
    //lstm_weight[i] = 0;
    printf("\n lstm_weight: %s\n\n", lstm_weight);
    lstm_val = atof(lstm_weight);
    printf("\n convert \"lstm_weight\" to lstm_val is : %f\n\n", lstm_val);
    return 0;
 }

但是我想Istm_val是0.4217959344387054443,我该怎么做呢?

A
double
通常有大约15位十进制精度。如果将值存储在double中,则不会获得比该值更高的精度。因为没有告诉
printf
输出要使用多少位精度,所以得到的是默认值

使用类似于
%0.15f
的内容,而不是
%f

将“lstm_重量”转换为lstm_值为:0.421795934438705

使用
%0.20f
,我得到:

将“lstm_重量”转换为lstm_值为:0.42179593443870544434


这是使用
双精度
打印
%.17f
可以达到的最高精度
0.42179593443870544

    printf("\n convert \"lstm_weight\" to lstm_val is : %.17f\n\n", lstm_val);


您可以尝试类似于
sprintf()
下面是一个例子:

#include <stdio.h>

int main() {
    char str[50];
    double n = 0.3984092590879;
    sprintf(str, "%lf", n);
    printf(str);
    return 0;
}

1) 在当前的体系结构中,
double
的精度不能达到18位小数。您可以尝试使用长双精度
。2) 阅读
printf()
的手册页。atof采用浮点数而不是双精度
fscanf是不允许的
但是为什么呢?这是一个标准功能,在任何地方都可用。
ato*
族可以调用UB,因此不应使用它们。看看原因。正确的转换方法是@phuclv
scanf
函数在其规范中有相同的缺陷,也不应该使用。@TruVortex\u 07谁说的
atof
接受一个
char*
表示一个
double
。您阅读了吗?使用
sprintf
printf
printf
系列中的任何函数进行打印没有区别,使用相同的格式说明符输出是相同的。没有比double能存储的精度更高的方法了他想要一种把他的double转换成字符串的方法,这就是他得到的
#include <stdio.h>

int main() {
    char str[50];
    double n = 0.3984092590879;
    sprintf(str, "%lf", n);
    printf(str);
    return 0;
}
0.3984092590879