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;
}
文章分類:C & C++|標籤:, ,

迴響已關閉