C++利用IO流對浮點數進行格式化控制輸出


浮點數輸出

(100/100 分數)
題目描述

編寫一個程序,輸入一個浮點數和輸出格式要求,按照格式要求將該浮點數輸出。給定非負整數m和n,表示輸出的浮點數小數點前的寬度為m,若寬度不夠則在前面補0,小數點后的寬度為n,若寬度不夠則在后面補0(補充說明:當n=0時,只需輸出整數部分,當m,n都為0時,則輸出0)。


輸入描述

每個測例共2行,第一行為兩個整數m,n(n >= 0, m >= 0),第二行為一個浮點數。


輸出描述

對每個測例輸出的浮點數占一行,其小數點前寬度為m,小數點后寬度為n,不足時補零。

 


樣例輸入
5 3
12.3456789
2 10
12.34

樣例輸出
00012.345
12.3400000000

 


 

 

AC代碼:

 1 #include <iostream>
 2 #include <sstream>
 3 #include <iomanip>
 4 #include <string>
 5 using namespace std;
 6 
 7 int main(void)
 8 {
 9     int m, n;
10     double num;
11 
12     while (cin >> m >> n >> num)
13     {
14         if (m == 0 && n == 0)
15             cout << 0 << endl;
16         else
17         {
18             cout << setw(m) << setfill('0') << int(num);
19             if (n != 0)
20             {
21                 ostringstream os;
22                 os << setiosflags(ios_base::fixed);
23                 os << fixed << setprecision(n+1) << num - int(num);
24                 os << setiosflags(ios_base::fixed);
25                 string str = os.str();
26                 for (int i = 1; i <= n+1; i++)
27                     cout << str[i];
28             }
29             cout << endl;
30         }
31     }
32 
33     return 0;
34 }

這題其實是很磨礪人的題,因為題目里有意無意地挖了幾個坑給我們(顯然是有意的,測試數據表明了這一點。)

 

大概要注意這幾點:

1、整數部分和小數部分的寬度格式控制一定要分開討論,而不能籠統的用 setw(m+n) 支持限制整個數字的寬度。因為這樣的控制不夠精確,也就是存在這樣的情況:當整數部分的寬度足夠而小數部分的寬度不夠時,小時部分可能找整數部分借了本不該屬於自己的“寬度”。

2、利用 sstream 對把小數部分轉換成字符串處理,避免輸出小數點前面的0。

3、由於小數部分不是四舍五入的(從樣例可以得知),所以這里用了一個小技巧,即每次多舍入一位(n+1),這樣舍入情況不會影響到我們需要輸出的最后一位小數,而輸出字符串的時候輸出到指定寬度n即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM