在软件开发中我们经常遇到数据精度处理问题。
先看如下代码
#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
$
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。