1. 程式人生 > >C++之Float型別, double型別

C++之Float型別, double型別

c++裡的小數分為float和double兩種型別, 這兩種型別, 直接看程式碼, 及執行結果我們來看一下他們有什麼區別:

#include "iostream"
using namespace std;

int main() {
	float tub = 10.0 / 3.0;
	double mint = 10.0 / 3.0;
	// 注意1.0E6之間不能有空格
	const float million = 1.0E6;
	
	cout << "tub = " << tub;
	// cout的預設輸出是會把無效位(也就是末尾的0給去掉), 並可能
	// 採用科學計數法進行顯示(這行程式碼就顯示: “, a million tubs = 3.33333e+06”)
	cout << ", a million tubs = " << million * tub;
	// 這行程式碼就強制讓cout輸出原始資料例如:333333.250000
	cout.setf(ios_base::fixed, ios_base::floatfield);
	cout << ", after translate a million tubs = " << million * tub;
	cout << ", \n and ten million tubs = ";
	cout << 10 * million * tub << endl;
	
	cout << "mint = " << mint << " and a million mints = ";
	cout << million * mint << endl;
	return 0;
}

再來看程式碼的執行結果:

接下來分析一下程式碼, 程式碼邏輯很簡單, 這裡只說一行:

cout.setf(ios_base::fixed, ios_base::floatfield);

這行程式碼就強制讓cout輸出原始資料例如:333333.250000, 而不是cout預設的那種輸出3.33333e+06這種格式, 僅僅是為了好對float和double的結果進行對比

通過執行結果我們能看的出來:

tub 和 mint還都算是精確, 但是把他們放大1000000後發現tubs已經不精確了, 而mints還算是精確, 

我們可以看出來, 在該系統中,  將tub*1000000後的結果為3333333.250000, 也就是不再精確, 但是保證了7位有效位, 也就是小數點後能保證6位是精確的(如果tub * 1000000 * 10 結果就更不精確了, 說明了float的精確度是有限的), 與之相比, double能至少保證13位是有效的,  因此相比而言double更精確一點.
在程式中預設情況下1.23和1.23E8都儲存為double型別(個人覺得是更精確), 如果希望常量儲存為float型別, 需要在常量後面加上f或F, 例如1.23f, 如果要儲存為long double型別, 則可以使用l或L字尾:

1.23f   float型別;     1.23E5F  float型別,   1.23E4 double型別,   1.23L long double型別

 

我們再來看另一個例子:

#include "iostream"
using namespace std;

int main() {
	float a = 1.23E10;
	float b = a + 1.0f;
	
	cout.setf(ios_base::fixed, ios_base::floatfield);
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "b - a = " << b - a << endl;
}

執行結果:

從這裡雖然b比a多了1, 但是由於float只能精確到第6, 7位, 所以多加的1對於b來說等於沒有, 因此他們的相減的結果為0,  這也進一步說明了float的不精確