在軟件開(kāi)發(fā)中我們經(jīng)常遇到數(shù)據(jù)精度處理問(wèn)題。
先看如下代碼
#include #include #include
int main ( void )
{
char *s="0.100001200";
fprintf ( stderr, "%f\n",atof(s));
return 0;
}
以上代碼編譯后執(zhí)行,結(jié)果如下:
$ 0.100001
$
問(wèn)題出在哪里,是 atof 函數(shù)的問(wèn)題? 將 atof(s) 替換成 strtod(s,NULL) 后,結(jié)果依然如此。
經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)并非是 atof 或 strtod 函數(shù)轉(zhuǎn)換時(shí)精度丟失,而是 %f 的格式化輸出符默認(rèn)的輸出為小數(shù)點(diǎn)后面 6 位的精度。
我們將上面的代碼修改為:
#include #include #include
int main ( void )
{
char *s="0.100001200";
fprintf ( stderr, "%18.10f\n",atof(s));
return 0;
}
編譯后執(zhí)行,結(jié)果如下
$ 0.100001200
$
深圳北大青鳥(niǎo)http://www.sbsnmc.com