HOWTO · C++
如何在 C++ 中列印指定小數點的數字
本文介紹瞭如何在 C++ 中列印指定小數點的數字。
本頁內容
若要輸出小數點後位數固定的浮點數,請在 std::cout 中依序使用 std::fixed 和 std::setprecision(n)。例如,std::fixed << std::setprecision(2) 會讓數值顯示為小數點後兩位。輸出需要引入 <iostream>,這些操縱器則需要引入 <iomanip>。
使用 std::fixed 與 std::setprecision
std::fixed 會選用定點表示法。啟用這種格式後,std::setprecision(n) 會設定小數點後的位數;輸出時會四捨五入,必要時也會在末尾補上零。若沒有使用 std::fixed,std::setprecision(n) 控制的則是有效位數。更多細節請參閱 setprecision 指南。
編譯並執行以下完整程式:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
#include <iomanip>
#include <iostream>
int main() {
const double values[] = {3.14159, 2.5, 0.004};
std::cout << std::fixed << std::setprecision(2);
for (double value : values) {
std::cout << value << '\n';
}
}
3.14
2.50
0.00
第一個數值會在輸出時四捨五入,第二個數值會顯示末尾的小數位,第三個數值則會以相同的兩位小數精度格式化。格式化只會改變顯示方式,不會改變儲存的數值,也不會讓浮點運算變得精確。若要顯示小數點後三位,請使用 std::setprecision(3)。
串流會將 std::fixed 和所選精度保留給後續插入的浮點數。若後續數值需要以不同方式顯示,請設定新的精度。這些操縱器宣告於 <iomanip>。範例中的程式碼與可見標籤或輸出文字維持英文。
使用 std::setw 與 std::setfill 對齊數值
若要排列欄位,std::setw(width) 會為下一個插入的值設定最小欄寬。它不會截斷超出欄寬的值,而且該欄寬在插入一次後就會重設。std::setfill(ch) 用來選擇填補字元,且會持續生效,直到再次更改。數值預設靠右對齊。
以下完整範例以句點作為填補字元,並讓每個格式化數值佔八個字元的欄位:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
#include <iomanip>
#include <iostream>
int main() {
std::cout << std::fixed << std::setprecision(2) << std::setfill('.')
<< std::setw(8) << 12.5 << '\n'
<< std::setw(8) << 3.75 << '\n';
}
...12.50
....3.75
每個需要欄寬的值都要再次套用 std::setw;更改填補字元不會設定欄寬。請選擇足以容納預期符號、數字、小數點與小數位的寬度。範例中的程式碼與可見標籤或輸出文字維持英文。
使用 printf 格式化
C++ 程式也可以使用 <cstdio> 中的 printf。在格式字串中,%.2f 會將浮點數輸出為小數點後兩位;將 2 改成其他數字即可指定不同的位數。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
#include <cstdio>
int main() {
const double value = 1.41421;
std::printf("Number with two decimal places: %.2f\n", value);
}
Number with two decimal places: 1.41
對 printf 而言,%f 是用於 double 引數的浮點數轉換格式。格式指定符必須與引數型別相符;配對錯誤可能造成未定義行為。此範例是完整的 C++ 程式,不需要串流相關標頭檔。範例中的程式碼與可見標籤或輸出文字維持英文。
如何選擇 C++ 串流或 printf
若需要能與其他串流插入操作組合、並保留各數值型別資訊的 C++ 串流格式化方式,請使用 std::cout 搭配 std::fixed 和 std::setprecision。若現有程式使用 printf 風格的格式字串,或這種語法更方便,也可以使用 printf。兩者都是有效的 C++ 用法。
若要固定小數位數,請記得同時使用 std::fixed 和 std::setprecision;在預設串流格式中,單獨使用精度操縱器有不同的意義。若欄位需要填補字元,請使用 std::setw 和 std::setfill。由於 std::setw 設定的欄寬只套用一次,請在每個值之前重新設定。範例中的程式碼與可見標籤或輸出文字維持英文。