C ++中的浮点格式化

时间:2013-01-21 03:19:24

标签: c++ floating-point cout

如何在C ++中格式化浮点数以输出四舍五入的小数位?我对setwsetprecision没有好运,因为我的编译器告诉我它们是not defined

cout << "Total : " << setw(2) << total << endl;

总产出:Total : 12.3961

我希望它是:12.4012.39,如果它的工作量太大了。

6 个答案:

答案 0 :(得分:16)

您需要包含<iomanip>并将命名空间范围提供给setw and setprecision

#include <iomanip>
std::setw(2)
std::setprecision(5)

尝试:

cout.precision(5);
cout << "Total : " << setw(4)   << floor(total*100)/100 << endl;

 cout << "Total : " << setw(4)   << ceil(total*10)/10 << endl;

iostream提供精确功能,但要使用setw,您可能需要包含额外的头文件。

答案 1 :(得分:16)

使用cout << fixedcout.setf(ios::fixed)std::cout.precision(<# of decimal digits>),如下所示(使用OSX Mavericks附带的Clang-503.0.40编译器):

#include <iostream>

int main()
{
   using namespace std;

   float loge = 2.718;
   double fake = 1234567.818;
   cout << fixed;
   cout.precision(2);
   cout << "loge(2) = " << loge << endl;
   cout << "fake(2) = " << fake << endl;
   cout.precision(3);
   cout << "loge(3) = " << loge << endl;
   cout << "fake(3) = " << fake << endl;
}

这个输出是(注意四舍五入):

loge(2) = 2.72
fake(2) = 1234567.82
loge(3) = 2.718
fake(3) = 1234567.818

这是简单的版本。代替使用cout << fixed;,您可以使用cout.setf(ios::fixed);(用于显示科学记数法,将 fixed 替换为 scientific ;两者都将设置位数在小数点右边)。请注意,如果格式标志不包含 fixed scientific ,则cout.precision()也用于设置小数点两侧总计显示的位数。 。互联网上有这方面的教程。

答案 2 :(得分:13)

要包括尾随零,仅设置精度是不够的。您还必须将浮点格式更改为 fixed 格式,该格式使用setprecision所说的位数作为小数点后的位数

std::cout << std::fixed << std::setprecision(2) << v;

Working online example code

答案 3 :(得分:3)

如果希望舍入为零,则可以使用C函数printf

#include <iostream>
#include <cstdio>

int main() {
    float v = 12.3961;
    std::printf("%.2f",v); //prints 12.40
}

与:相比:

#include <iostream>
#include <iomanip>

int main() {
    float v = 12.3961;
    std::cout << std::setprecision(4) << v; //prints 12.4
}

答案 4 :(得分:2)

您可以使用 C++20 std::format

std::cout << std::format("Total     : {:.2f}\n", total);

the {fmt} library 中的 fmt::format 函数,std::format 是基于。 {fmt} 还提供了 print 函数,它集成了格式化和输出,使其更容易和更高效 (godbolt):

#include <fmt/core.h>

int main() {
  fmt::print("Total     : {:.2f}\n", 12.3961);
}

输出:

Total     : 12.40

这使用 IEEE754 默认舍入模式(舍入到最接近的偶数),因此您必须自行舍入 (How do I round up/down a decimal place of a float value? C++)。

答案 5 :(得分:1)

这有点脏...

template <typename T>
string sFormat(const char *f, T value)
{
    char buffer[64];
    snprintf(buffer, sizeof(buffer), f, value);
    return string(buffer);
}

做这样的事情:

cout << "Result :" << sFormat(" %5.2f", 3.14) << sFormat(" %5d", 2300) << endl;