1、將字符串轉(zhuǎn)化為float、double
浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)機(jī)制和整形數(shù)據(jù)不同,有舍入誤差,在計(jì)算機(jī)中用近似表示任意某個(gè)實(shí)數(shù)。具體來(lái)說(shuō),這個(gè)數(shù)由一個(gè)整數(shù)或定點(diǎn)數(shù)(即尾數(shù))乘以某個(gè)基數(shù)(計(jì)算機(jī)中通常是2)的整數(shù)次冪得到。這種表示方法類(lèi)似于基數(shù)為10的科學(xué)計(jì)數(shù)法。所以浮點(diǎn)數(shù)在運(yùn)算過(guò)程中隨著因?yàn)闊o(wú)法精確表示而進(jìn)行近似或舍入。但是這種設(shè)計(jì)的好處是可以在固定的長(zhǎng)度上存儲(chǔ)更大范圍的數(shù)。
轉(zhuǎn)化過(guò)程存在精度損失,只是float、double各自損失的精度不相同而已
std::string str="8.2";
float?cc=atof(str.c_str());??//cc的值為8.1999998
std::string str="8.2";
double?cc=atof(str.c_str());??//cc的值為8.1999999999999993
2.float、double判斷是否等于0
float是32位,double是64位。float32位中,有1位符號(hào)位,8位指數(shù)位,23位尾數(shù)位。double64位中,1位符號(hào)位,11位指數(shù)位,52位尾數(shù)位。
一般float型只能精確到小數(shù)到后六位即1e-6,將float型的數(shù)a的絕對(duì)值abs(a)與1e-6比較,如果abs(a)比1e-6還要小的話(huà)就可以認(rèn)為a的值為零,因?yàn)樾?shù)六位以后是不精確的,是沒(méi)有意義的。
比如數(shù)0.0000001雖然確實(shí)不等于零,但是第七位小數(shù)1是沒(méi)有意義的就可以認(rèn)為這個(gè)數(shù)等于0。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-722753.html
float,double分別遵循R32-24,R64-53的標(biāo)準(zhǔn)。所以float的精度誤差在1e-6;double精度誤差在1e-15,所以要判斷一個(gè)單精度浮點(diǎn)數(shù):則是if( abs(f) <= 1e-6);要判斷一個(gè)雙精度浮點(diǎn)數(shù):則是if( abs(f) <= 1e-15 );若小于,為0,大于,不為0 。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-722753.html
float a = 0;
if(fabs(a) < 1e-6)
{
printf("%f\n",fabs(a));
printf("float Equal 0!\n");
}
else
{
printf("%f\n",fabs(a));
printf("float not Equal 0!\n");
}
double b = 0;
if(fabs(b) < 1e-15)
{
printf("%f\n",fabs(a));
printf("double Equal 0!\n");
}
else
{
printf("%f\n",fabs(a));
printf("double not Equal 0!\n");
}
到了這里,關(guān)于float、double類(lèi)型的轉(zhuǎn)化和判斷為零問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!