【C++菜鳥問題】C++浮點數(float、double)比較、相等判斷
文章推薦指數: 80 %
用"=="來比較兩個double應該相等的類型,返回真值完全是不確定的。
計算機對浮點數的進行計算的原理是隻保證必要精度內正確即可。
我們在判斷 ...
請輸入正確的登錄賬號或密碼
註冊
忘記密碼
首頁
未分類
正文
【C++菜鳥問題】C++浮點數(float、double)比較、相等判斷
原創
miaoyue_mm12344
2018-08-2612:00
浮點數在內存中的存儲機制和整型數不同,其有舍入誤差,在計算機中用近似表示任意某個實數。
具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似於基數爲10的科學記數法。
所以浮點數在運算過程中通常伴隨着因爲無法精確表示而進行的近似或舍入。
但是這種設計的好處是可以在固定的長度上存儲更大範圍的數。
1、將字符串轉換爲float、double過程存在精度損失,只是float、double各自損失的精度不相同而已 std::stringstr="8.2"; floatcc=atof(str.c_str()); //cc的值爲8.1999998 std::stringstr="8.2"; doublecc=atof(str.c_str()); //cc的值爲8.19999999999999932、將float、double轉換爲字符過程中可能存在精度損失,但是通過%.8lf可以規避(1)float小數點前後加起來有效數字只有6位。
當給定的float有效數在6位以內轉換爲字符不會丟失精度,當有效位數大於6位就會存在精度丟失 //精度沒有丟失 charbuf[100]={'\0'}; floataa=8000.25; sprintf(buf,"%f",aa); //8000.250000 //精度沒有丟失 charbuf[100]={'\0'}; floataa=8.00025; sprintf(buf,"%f",aa); buf=8.000250 //精度丟失,存在誤差 charbuf[100]={'\0'}; floataa=8000.251; sprintf(buf,"%f",aa); //8000.250977 //精度丟失,存在誤差此時使用.8lf也無效 charbuf[100]={'\0'}; floataa=8000.251; sprintf(buf,"%.8lf",aa);//8000.25097656 (2)double小數前後加起來的有效數字只有16位,當給定的double有效數在16位以內轉換爲字符串不會丟失精度,當有效位數大於16位就會存在精度丟失 存在誤差 charbuf[100]={'\0'}; doubleaa=121.437565871234012; sprintf(buf,"%.20lf",aa);//121.43756587123401000000 //沒有誤差 charbuf[100]={'\0'}; doubleaa=8000.256165; sprintf(buf,"%.8lf",aa); std::cout<
也可以abs(x)<= EPSINON比如要判斷浮點數floatA和B是否相等,我們先令float x=A–B;並設constfloatEPSINON=0.00001; 則if((x>=-EPSINON)&&(x<=EPSINON);//或者if(abs(x) <=EPSINON)cout<
usingnamespacestd;
#include
延伸文章資訊
- 1Back to Basic: 談浮點數的比較 - novus log - 痞客邦
不熟悉浮點數的人最容易犯的錯誤之一,就是直接用== 或!= 比較兩個浮點數。以最常見的IEEE 754 浮點數來說,下面這樣的判斷式竟然不成立: if (0.1 + ...
- 2浮點數比較大小 - w3c菜鳥教程
浮點數比較大小,在數算當中經常會涉及到判斷兩個數是否相等的情況對於整數很好處理a b這樣的一個語句就可以解決全部的問題但是對於浮點數是不同的 ...
- 3【懶人包】五大網購平台「點數X聯名卡」全攻略 - 卡優新聞網
【懶人包】五大網購平台「點數X聯名卡」全攻略 ; 點數期限. 依照通路、活動而有所不同,信用卡回饋為1年 ; 使用範圍. momo購物 ; 使用規則 · 1點價值1元 ○訂單折抵無上限.
- 4open point兌換全攻略!點數轉換爽賺17%! (持續更新)
想集點?!第一步當然是先下載open point APP註冊會員囉! 不過7-11比較特別的地方是,當你結帳時使用不同方式,open point點數回饋的比例也不同!
- 5IEEE754告訴我們,為什麼不能直接比較兩個浮點數是否相等?
也就是說float精度為6或7位,double是15或16位。 提示:3.45E6表示的是3450000,6被稱為指數,3.45被稱為尾數. 浮點數是採用二 ...