C 将字符串转换为double,答案是正确的,但不是很准确
我想使用atof将字符串转换为双精度,答案是正确的,但不是很准确 注意:由于其他原因,不允许使用fscanf 我的代码是: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
#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,因此不应使用它们。看看原因。正确的转换方法是@phuclvscanf
函数在其规范中有相同的缺陷,也不应该使用。@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