【问题标题】:What is the C++ equivalent of the c float precision command?c float 精度命令的 C++ 等效项是什么?
【发布时间】:2023-03-14 22:31:02
【问题描述】:

在 C 中我们有这样的语句:

printf("%6.3f ",floatNumber);

限制打印时的位数。
如何在 C++ 中实现类似的行为?我知道setprecision,但这并不能帮助我做同样的事情。

【问题讨论】:

标签: c++ c format-string


【解决方案1】:

要获得与%6.3f 指定的格式相似的格式,只需使用标准 iostream 操纵器即可:

std::cout << std::fixed << std::setw(6) << std::setprecision(3) << f;

特别是std::fixed 表示与格式字符串中的f 相同的基本格式,例如,“精度”对于格式字符串和ostream 表示相同的含义。 std::setprecision(3) 然后实际设置精度,std::setw(6) 设置字段宽度。如果不设置std::fixed,您将获得类似于格式字符串"%6.3g" 指定的格式。

请注意,除了setw,这些操纵器都是粘性的。也就是说,它们在一个变量输出后仍然有效。

【讨论】:

    【解决方案2】:

    您最好的选择是使用boost::format。见the documentation,尤其是the examples

    接下来最好的(如果你不能在你的项目中使用boost)是继续使用printf。它是 C++ 标准库的一部分,因此只要您像往常一样#include &lt;stdio.h&gt;,它就应该“正常工作”。

    【讨论】:

    • 谢谢,但我并没有刻意尝试使用 c 库,我想知道是否有纯 C++ 这样做。
    • @Hossein:没有“纯 C++”。 C++ 标准明确包含 C 标准库,并且许多 iostream 和字符串函数强制使用sprintf 进行格式化。没有人会因为你使用 printf 而看不起你。
    • @Hossein 但是,您可以使用来自&lt;cstdio&gt;std::printf,这确实是来自@987654333 的已弃用printf 的非弃用“纯C++” 版本@,因此 "pure" 并不比 std::ostream 或其他任何东西少(最后&lt;stdio.h&gt; 也不比 "pure" 少,因为C++ 包含 C 库,只是它已被弃用,无论在实践中意味着什么(可能什么都没有)。
    • @Hossein 以 C 函数 remove 为例。似乎没有 "pure C++" 函数可以模仿它(直到 &lt;filesystem&gt; 被添加到标准中)。但是你知道吗,实际上有std::remove(来自&lt;cstdio&gt;,而不是来自&lt;algorithm&gt;),它做的事情完全相同,并且不比假设的“纯” &lt;filesystem&gt;。它只是工作方式不同,样式可能不适合您的 "pure C++" 代码的其余部分,但它完全是 "pure C++" 的一部分并且可以完成工作.
    • 我遵循 Alexander Stepanov 的建议,“当我们用 C++ 编程时,我们不应该为它的 C 遗产感到羞耻,而是要充分利用它”(stepanovpapers.com/notes.pdf,第 10 页)。如果您不熟悉 Stepanov,他曾在设计和实施 STL 的三人团队中。
    猜你喜欢
    • 1970-01-01
    • 2022-02-06
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多