我有一个float值的列表,我想用cout打印它们并保留小数点后2位。

例如:

10.900  should be printed as 10.90
1.000 should be printed as 1.00
122.345 should be printed as 122.34


如何我做这个吗?

setprecision似乎对此没有帮助。)

#1 楼

使用<iomanip>时,可以使用std::fixedstd::setprecision

这里是一个示例

#include <iostream>
#include <iomanip>

int main()
{
    double d = 122.345;

    std::cout << std::fixed;
    std::cout << std::setprecision(2);
    std::cout << d;
}


,您将获得输出

>
122.34


评论


为什么在程序中使用“ std:fixed”?

– Vilas Joshi
18年6月5日在16:59

可以为此定义一个有用的头:#define FIXED_FLOAT(x)std :: fixed << std :: setprecision(2)<<(x)简化了用法:cout << FIXED_FLOAT(d)

– Udayraj Deshmukh
18年8月25日在2:03

@ VilasJoshi,setprecision设置小数点后的位数,如果有5位数字,我们使用setprecision(2)我们将得到2位数字,但是如果有0位数字,它将不显示任何数字,使用fixed我们将固定很多数字显示为5,则表示为5.00否5

–vaibnak
18-10-18在13:33

#2 楼

您快到这里了,还需要使用std :: fixed,请参考http://www.cplusplus.com/reference/iostream/manipulators/fixed/

#include <iostream>
#include <iomanip>

int main(int argc, char** argv)
{
    float testme[] = { 0.12345, 1.2345, 12.345, 123.45, 1234.5, 12345 };

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

    for(int i = 0; i < 6; ++i)
    {
        std::cout << testme[i] << std::endl;
    }

    return 0;
}


输出:

0.12
1.23
12.35
123.45
1234.50
12345.00


#3 楼

setprecision(n)适用于整数,而不是小数部分。您需要使用定点格式将其应用于小数部分:setiosflags(ios::fixed)

#4 楼

简化接受的答案

简化示例:

#include <iostream>
#include <iomanip>

int main()
{
    double d = 122.345;
    std::cout << std::fixed << std::setprecision(2) << d;
}


您将获得输出

122.34


参考:



std::fixed
std::setprecision


评论


这对我有用:std :: cout << std :: setprecision(2)<< std :: fixed << d;

– Andrea Girardi
2018年6月7日14:22



#5 楼

我想要整数格式时遇到问题。
为了完整性,重写:
#include <iostream>
#include <iomanip>

int main()
{
    //    floating point formatting example

    double d = 122.345;
    std::cout << std::fixed << std::setprecision(2) << d << std::endl;
    //    Output:  122.34


    //    integer formatting example

    int i = 122;
    std::cout << std::fixed << std::setprecision(2) << double(i) << std::endl;
    //    Output:  122.00
}


评论


由于未使用命名空间,因此您在cout和endl之前缺少了std ::。

–blackforest-tom
19年10月8日在11:03

@ blackforest-tom-也许您是对的,不记得了-我通常会复制粘贴工作程序,因此该程序可以在Visual Studio或其他地方按原样运行。

–Manohar Reddy Poreddy
19-10-9在15:21

由于有新的支持,为方便其他人,在“ cout”和“ endl”中添加了“ std ::”。

–Manohar Reddy Poreddy
10月5日10:27



#6 楼

我在编码竞赛中遇到了类似的问题,这就是我的处理方式。
将所有双精度值的精度设置为2

首先添加标头以使用setprecision

#include <iomanip>

,然后在主目录中添加以下代码

  double answer=5.9999;
  double answer2=5.0000;
  cout<<setprecision(2)<<fixed;
  cout <<answer << endl;
  cout <<answer2 << endl;


输出:

5.99
5.00

/>
您需要使用固定值来编写5.00,这就是为什么,您的输出将不会达到5.00。

我添加的简短参考视频链接很有帮助

#7 楼

您必须将“浮动模式”设置为固定。

float num = 15.839;

// this will output 15.84
std::cout << std::fixed << "num = " << std::setprecision(2) << num << std::endl;


#8 楼

要在小数点后设置固定的2位数字,请先使用以下数字:

cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(2);


,然后打印双精度值。 br />
#include <iostream>
using std::cout;
using std::ios;
using std::endl;

int main(int argc, char *argv[]) {
    cout.setf(ios::fixed);
    cout.setf(ios::showpoint);
    cout.precision(2);
    double d = 10.90;
    cout << d << endl;
    return 0;
}


#9 楼

#include<stdio.h>
int main()

{

 double d=15.6464545347;

printf("%0.2lf",d);

}


#10 楼

带有模板

#include <iostream>

// d = decimal places
template<int d> 
std::ostream& fixed(std::ostream& os){
    os.setf(std::ios_base::fixed, std::ios_base::floatfield); 
    os.precision(d); 
    return os; 
}

int main(){
    double d = 122.345;
    std::cout << fixed<2> << d;
}


也与科学类似,具有宽度选项(适用于列)

// d = decimal places
template<int d> 
std::ostream& f(std::ostream &os){
    os.setf(std::ios_base::fixed, std::ios_base::floatfield); 
    os.precision(d); 
    return os; 
}

// w = width, d = decimal places
template<int w, int d> 
std::ostream& f(std::ostream &os){
    os.setf(std::ios_base::fixed, std::ios_base::floatfield); 
    os.precision(d); 
    os.width(w);
    return os; 
}

// d = decimal places
template<int d> 
std::ostream& e(std::ostream &os){
    os.setf(std::ios_base::scientific, std::ios_base::floatfield); 
    os.precision(d); 
    return os; 
}

// w = width, d = decimal places
template<int w, int d> 
std::ostream& e(std::ostream &os){
    os.setf(std::ios_base::scientific, std::ios_base::floatfield); 
    os.precision(d); 
    os.width(w);
    return os; 
}

int main(){
    double d = 122.345;
    std::cout << f<10,2> << d << '\n'
        << e<10,2> << d << '\n';
}


#11 楼

只是一点点;使用命名空间std将以下内容放在标题中

;

然后

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

简化为


评论


是的,它确实变得“简化了”,但是强烈建议不要这样做。请不要使用命名空间std使用;为此-了解您为什么这样做。

–卡洛斯F
19年11月1日在12:22

#12 楼

这是一个使用矩阵的示例。

cout<<setprecision(4)<<fixed<<m[i][j]