程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++利用IO流對浮點數進行格式化控制輸出,io點數

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

編輯:C++入門知識

C++利用IO流對浮點數進行格式化控制輸出,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即可。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved