c++ setprecision用法詳解

2020-07-16 10:04:37
浮點值可以四捨五入到若干位有效數或精度,這是出現在小數點前後的總位數。可以通過使用 setprecision 操作符來控制顯示浮點數值的有效數的數量。

下面的程式顯示了用不同數量的有效數來顯示除法運算的結果:
// This program demonstrates how the setprecision manipulator
// affects the way a floating-point value is displayed.
#include <iostream>
#include <iomanip> // Header file needed to use setprecision
using namespace std;

int main()
{
    double number1 = 132.364, number2 = 26.91;
    double quotient = number1 / number2;
    cout << quotient << endl;
    cout << setprecision(5) << quotient << endl;
    cout << setprecision(4) << quotient << endl;
    cout << setprecision(3) << quotient << endl;
    cout << setprecision(2) << quotient << endl;
    cout << setprecision(1) << quotient << endl;
    return 0;
}
程式輸出結果:

4.91877
4.9188
4.919
4.92
4.9
5

注意,使用預標準編譯器輸出的結果可能與此結果不同。

程式中的第一個值顯示在第 11 行,沒有設定 setprecision 操作符(預設情況下,系統使用 6 個有效數顯示浮點值)。後續的 cout 語句列印相同的值,但四捨五入為 5、4、3、2 和 1 個有效數。

請注意,與 setw 不同的是,setprecision 不計算小數點。例如,當使用 setprecision(5) 時,輸出包含 5 位有效數,但是需要 6 個位置來顯示 4.9188。

如果一個數位的值可以由少於 setprecision 指定的精度位數來表示,則操作符將不起作用。在以下語句中,dollars 的值只有 4 位數位,所以 2 個 cout 語句顯示的數位都是 24.51:

double dollars = 24.51;
cout << dollars << endl;  // 顯示 24.51
cout << setprecision (5) << dollars << endl; // 顯示 24.51

表 1 顯示了 setprecision 如何影響各種值的顯示方式。請注意,如果有效數少於要顯示的數位,則 setprecision 將捨入,而不是截斷數位。另外還需要注意的是,末尾的零將被省略。因此,儘管指定了  setprecision(5),但是 21.40 仍顯示為 21.4。

表 1 setprecision 操作符
數 字 操作符 顯示的值
28.92786 setprecision(3) 28.9
21.40 setprecision(5) 21.4
109.50 setprecision(4) 109.5
34.78596 setprecision(2) 35

與 setw 欄位寬度不同的是,setprecision 的精度設定將保持有效,直到更改為其他值為止。與所有格式化操作符一樣,必須包含標頭檔案 iomanip 才能使用 setprecision。

下面的程式顯示了如何組合使用 setw 和 setprecision 操作符來控制顯示浮點數的方式。
// This program asks for sales figures for three days.
// The total sales are calculated and displayed in a table.
#include <iostream>
#include <iomanip> // Header file needed to use stream manipulators
using namespace std;

int main()
{
    double day1, day2, day3, total;
    // Get the sales for each day
    cout << "Enter the sales for day 1: ";
    cin >> dayl;
    cout << "Enter the sales for day 2: ”;
    cin >> day2;
    cout << "Enter the sales for day 3: ”;
    cin >> day3;
    // Calculate total sales
    total = day1 + day2 + day3;
    // Display the sales figures
    cout << "nSales Figuresn";
    cout << "-------------n" ;
    cout << setprecision (5);
    cout << "Day 1: " << setw(8) << day1 << endl;
    cout << "Day 2: " << setw(8) << day2 << endl;
    cout << "Day 3: " << setw(8) << day3 << endl;
    cout << "Total: " << setw(8) << total << endl;
    return 0;
}
程式輸出結果:
Enter the sales ;for day 1: 321.57 
Enter the sales for day 2: 269,60
Enter the sales for day 3: 307.00
Sales Figures
-------------
Day 1:   321.57
Day 2:    269.6
Day 3:      307
Total:   898.17
該程式建立的輸出,按照指示,允許顯示最多 5 個有效數,並以 8 個字元的欄位寬度右對齊列印。