cout控制輸出的小數點位數
有時候,我們可能要計算浮點數,像是2/5、3/30,又或是1/3。
重點來了,當計算結果為循環小數,或是有多個小數位數的數要怎麼辦? 要直接全部輸出嗎? 還是..只輸出整數位數呢?
不用緊張,cout中就有一個控制小數位數的函數(setprecision)。
控制的方法也很簡單,快點繼續看下去吧!
「setprecision」包含在<iomanip>函式庫內,與setw不同的是,setprecision控制的是輸出數值的「位數」,而setw控制的則是輸出數值或字串的「寬度」。這兩種東西有甚麼不同呢?好吧,舉個例子:
「 123456」
上面數字前的空格加上數字就是「寬度」,如果只有數字就是「位數」,這樣舉例懂了嗎?
setprecision的格式如下:
cout << setprecision(輸出位數) << 變數/數字 << endl;
例如:
cout << setprecision(3) << 3.123 << endl;
這樣的輸出結果就會是「3.12」。
再舉一個例子:
cout << setprecision(5) << 3.123456 << endl;
這樣的輸出結果就會是「3.1235」。
為什麼不是「3.1234」而是「3.1235」呢? 因為,setprecision函數取到最後一位時,會進行四捨五入法,「3.123456」因為下一位是5,所以進位,4+1=5,因此輸出「3.1235」。
再舉一個例子吧:
cout << setprecision(2) << 3.1111111 << endl;
輸出的結果是「3.1」。
你也許會問:可以只控制「小數點後的位數嗎」?
我回:當然可以,不然標題寫假的阿XD 只要加上「fixed」就可以囉!
格式如下:
cout << fixed << setprecision(輸出位數) << 變數/數字 << endl;
舉例:
cout << fixed << setprecision(2) << 3.1234 << endl;
這樣的輸出結果就會是「3.12」。
那如果有多行cout會怎麼樣呢?
舉個例子:
cout << fixed << setprecision(2) << 3.1234 << endl;
cout << 5.132223 << endl;
你覺得會輸出什麼呢? 第一行輸出「3.12」錯不了,那第二行呢? 是「5.132223」,還是「5.13」? 猜猜看吧!
答案是「5.13」!
再舉個例子:
cout << setprecision(2) << 3.1234 << endl;
cout << 5.132223 << endl;
第一行輸出「3.1」錯不了,那第二行呢? 是「5.132223」,還是「5.1」? 再猜猜看吧!
答案是「5.1」!
由此可知, setprecision一旦使用,也會影響到下面的cout,要如何結束setprecision,目前還找不到方法,麻煩知道「如何結束setprecision」的C++高手回覆一下吧!
針對fixed,我們再舉一個例子:
float x=51.1;
cout << fixed << setprecision(3) << 3.1234 << endl;
cout << x << endl;
你覺得x輸出後會是什麼呢? 是「51.1」嗎? 錯!第二個cout會受到fixed 和 setprecision(3)的影響,讓輸出結果變成「51.100」。
如果我們不想要讓第二個cout輸出數值輸出到小數點第三位,要怎麼做?
答案就是:使用「cout.unsetf( ios::fixed );」關閉fixed。
我們將上面程式碼加上「cout.unsetf( ios::fixed );」,如下↓
cout << fixed << setprecision(3) << 3.1234 << endl;
cout.unsetf( ios::fixed );
cout << x << endl;
如此一來,第二個cout輸出的x,就會是「51.1」。
如果你還想要更精確的控制輸出的位數,可以再次使用setprecision。目前來說,使用setprecision後,就必須一直用下去(setprecision會影響下面所有cout的輸出位數),因為還找不到關閉它的方法(上面文章已提到過)。
舉了這麼多例子了,我們快來實作看看吧!
實作練習
寫一C++程式,讓使用者連續輸入浮點數,與設定輸出的小數位數。
圖例↓
程式碼↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include<iostream> #include <iomanip> //setprecision會用到的函式庫 using namespace std; int main() { double x; //儲存浮點數 int n; //儲存小數位數 while(true) { cout << "請輸入一浮點數: "; //提示使用者,讓他知道現在要輸入浮點數 cin >> x; //輸入x的值 cout << "請輸入此浮點數輸出的小數位數: "; //提示使用者,讓他知道現在要輸入欲輸出的小數位數 cin >> n; //輸入n的值 cout << endl; //換行 cout << "輸出結果: " << fixed << setprecision(n) << x << endl << endl; //輸出結果 } return 0; } |