【问题标题】:std::cout << Predicting the automatic field width in displayed for an arbitrary doublestd::cout << 预测任意双精度显示的自动字段宽度
【发布时间】:2011-07-10 03:29:40
【问题描述】:

我在控制台上显示了大量的双精度数,我想提前知道 std::cout 将决定为给定的双精度显示多少个小数位。这基本上是这样我可以让它在控制台中看起来很漂亮。 例如(伪代码)

feild_width = find_maximum_display_precision_that_cout_will_use( whole_set_of_doubles );
...
// Every cout statement:
std::cout << std::setw( feild_width ) << double_from_the_set << std::endl;

我认为 cout “猜测”?基于双精度显示的良好精度。比如好像显示

std::cout << sqrt(2) << std::endl;

如 1.41421,但也

std::cout << (sqrt(0.5)*sqrt(0.5) + sqrt(1.5)*sqrt(1.5)) << std::endl;

作为 2(而不是 2.000000000000?????? 或 1.99999999?????)。好吧,也许这会精确计算为 2.0,但我认为 sqrt(2) 不会精确计算为 1.41421,因此 std::cout 必须决定在某个点显示多少小数位,对吧?

是否有可能预测这一点来制定find_maximum_display_precision...() 函数?

【问题讨论】:

    标签: c++


    【解决方案1】:

    你需要的是固定的 iomanip。

    http://www.cplusplus.com/reference/iostream/manipulators/fixed/

    double d = 10/3;
    
    std::cout << std::setprecision(5) << std::fixed << d << std::endl;
    

    【讨论】:

      【解决方案2】:

      有时 C++ I/O 会受到影响。有时做出漂亮的输出就是其中之一。 C printf 系列更容易控制、更容易理解、更简洁,并且不会被那些真正糟糕的 ios:: 全局变量所困扰。如果出于其他原因需要使用 C++ 输出,则始终可以将 sprintf/snprintf 打印到字符串缓冲区,然后使用

      【讨论】:

      • 是的,它们都以独特的方式看起来很丑。 printf 样式更容易美化,但当您必须不必要地管理该字符串缓冲区时,它就不那么整洁了。感谢您的回答,或者更确切地说,阅读问题。 :P
      【解决方案3】:

      在您的问题中,您将精度和宽度混合在一起,这是两个不同的东西。 其他答案集中在精度上,但给定的精度是显示数字的最大值,而不是最小值。如果没有设置ios::fixedios::scientific,它不会填充尾随零。

      这是确定用于输出的字符数的解决方案,包括符号和 10 的幂:

      #include <string>
      #include <sstream>
      #include <vector>
      
      size_t max_width(const std::vector<double>& v)
      {
        size_t max = 0;
      
        for (size_t i = 0; i < v.size(); ++i)
        {
          std::ostringstream out;
          // optional: set precision, width, etc. to the same as in std::cout
          out << v[i];
          size_t length = out.str().size();
          if (length > max) max = length;
        }
        return max;
      }
      

      【讨论】:

      • 所以,我想我需要试试看。可惜图书馆没有标准的部分可以告诉你,嗯...
      • @Bingo:C++ 标准中的第 27 条读起来很乏味。尝试 [Stroustrup, 3rd Edition, p.628] 中的 §21.4。他说:通用格式让实现选择一种格式,该格式以最能保留可用空间中的值的样式呈现值。精度指定最大位数。它对应于printf()%g。因此,当您坚持使用固定格式时,请遵循 @Martin 给出的建议。
      【解决方案4】:

      std::cout::precision();用它来确定精度 示例:

      # include <iostream>
      # include <iomanip>
      
      int main (void) 
      {
      
         double x = 3.1415927
      
         std::cout << "Pi is " << std::setprecision(4) << x << std::endl;
         return 1;
      }
      

      这将显示:

      Pi is 3.142
      

      此链接还包括对 std::cout::precision(); 的解释。 http://www.cplusplus.com/reference/iostream/ios_base/precision/

      【讨论】:

        猜你喜欢
        • 2012-02-16
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        相关资源
        最近更新 更多