在软件开发中我们经常遇到数据精度处理问题。
先看如下代码
#include <stdio.h> #include <stdlib.h> #include <string.h>
int main ( void )
{
char *s="0.100001200";
fprintf ( stderr, "%f\n",atof(s));
return 0;
}
以上代码编译后执行,结果如下:
$ 0.100001
$
问题出在哪里,是 atof 函数的问题? 将 atof(s) 替换成 strtod(s,NULL) 后,结果依然如此。
经过测试,发现并非是 atof 或 strtod 函数转换时精度丢失,而是 %f 的格式化输出符默认的输出为小数点后面 6 位的精度。
我们将上面的代码修改为:
#include <stdio.h> #include <stdlib.h> #include <string.h>
int main ( void )
{
char *s="0.100001200";
fprintf ( stderr, "%18.10f\n",atof(s));
return 0;
}
编译后执行,结果如下
$ 0.100001200
$