【问题标题】:C++ printf printing doubles reads as 0C ++ printf打印双打读取为0
【发布时间】:2014-01-17 20:50:39
【问题描述】:

所以我想使用 printf 以便可以使列对齐,但 printf 似乎无法打印需要科学记数法的双精度数。它只是以 0 的形式出现,但使用 cout 它会很好。 'in' 和 'fn' 是结构体 'x' 'y' 和 'z' 是双精度的

代码

printf("Facet Normal: %lf %15lf %15lf\n", in->fn.x, in->fn.y, in->fn.z);
cout << "cout test: " << in->fn.x << endl;

输出

Facet Normal: -0.000000       -0.894426        0.447215
cout test: -9.6137e-08

我似乎无法让 printf 正常工作。我让整个功能与 cout 一起正常工作,但就像我说的那样,我希望事情能很好地排列。

编辑:

正如 Oli 所说,使用 %e 确实可以正确打印。通过在整个过程中使用 %e ,它会将所有内容都以科学记数法表示,并且数据集中的许多数字实际上并不真正需要它。 Cout 似乎根据需要在 %lf 和 %e 之间转换。是否有一种简单的方法可以让 printf 也获得这种行为?

答案:

%f 用于 float 和 double(因为 float 参数被提升为 double); %lf 是 long double。 f 打印不带指数,e 打印带指数,和 g 使用看起来更好的那个(遵循特定规则)。 ——基思·汤普森

%g 得到了我正在寻找的确切行为!

【问题讨论】:

  • 当你使用 C++ 时,最好使用 C++ iostream,而不是 stdio.h:那更像是 C 代码
  • %f 用于floatdouble(因为float 参数被提升为double); %lf 用于 long doublef 打印没有指数,e 打印有指数,g 使用看起来更好的那个(遵循特定规则)。

标签: c++ double printf cout scientific-notation


【解决方案1】:

您似乎想要获得“最佳”格式(这是std::ostream 的默认值):您可以使用%g%Lglong double)让格式函数决定值应该如何被格式化。有四种格式说明符:

  1. %f 用于定点表示法(std::fixed 用于流的格式)。
  2. %e 用于科学格式(std::scientific 用于流的格式)。
  3. %g 用于固定和科学的“最佳”版本(流和自 C++11 以来的默认值 std::defaultfloat)。
  4. %a 用于浮点数的精确/十六进制表示(自 C++11 起 std::hexfloat)。

格式化标志可以在小写和大写中使用,以指示任何字符是小写还是大写(例如eE)。请注意,l 长度说明符实际上与浮点格式无关。不过,在格式化 long double 时,您可能需要使用 L

【讨论】:

    【解决方案2】:

    正如std::printf() reference 所说,只需使用%e

    std::printf( "One double in decimal scientific notation! %e" , my_double );
    

    但正确的 C++ 方式是使用std::cout 和一些操纵器,在这种情况下为std::scientific

    std::cout << "One double in decimal scientific notation!" << std::scientific << my_double;
    

    注意std::cout的格式是其状态的一部分,也就是说,您只需配置一次,该格式将应用于设置后的任何输出操作,在其他格式更改之前:

    std::cout << std::scientific;
    
    std::cout << std::pow( 10.0 , 10.0 ) << std::endl;
    std::cout << std::pow( 10.0 , 20.0 ) << std::endl;
    std::cout << std::pow( 10.0 , 30.0 ) << std::endl;
    

    1e11
    1e21
    1e31

    【讨论】:

    • 请人们,当downvote写评论。我不明白为什么这有一个downvote
    【解决方案3】:

    如果您想控制 std::cout 的输出,请使用 setw() 和 setfill()。 http://www.cplusplus.com/reference/iomanip/setw/

    您还可以设置精度等。我将留给您探索。

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 2015-01-07
      相关资源
      最近更新 更多