• 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即可。

  • 相关阅读:
    spring 配置版本问题
    sublime与Emment
    工欲善其事必先利其器之浏览器篇
    工欲善其事必先利其器之windows篇
    工欲善其事必先利其器之搜索引擎
    营销自我
    java必备技能
    离线安装ADT和sdk
    eclipse的小技巧
    匿名内部类
  • 原文地址:https://www.cnblogs.com/maples7/p/4582124.html
Copyright © 2020-2023  润新知