使用cout打印正确的小数点数


133

我有一个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似乎对此没有帮助。)

Answers:


195

使用<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

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

1
可以为此定义一个有用的标头:#define FIXED_FLOAT(x) std::fixed <<std::setprecision(2)<<(x) 简化了以下用途:cout<<FIXED_FLOAT(d)
Udayraj Deshmukh,

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

43

您快到这里了,还需要使用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

18

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


12

简化接受的答案

简化示例:

#include <iostream>
#include <iomanip>

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

你会得到输出

122.34

参考:


这对我有用:std :: cout << std :: setprecision(2)<< std :: fixed << d;
安德里亚·吉拉迪

5

我想要整数时遇到一个整数问题。

为了完整性而重写:

#include <iostream>
#include <iomanip>

int main()
{
    //    floating point formatting example

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


    //    integer formatting example

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

您在cout和endl之前缺少std ::,因为您没有使用命名空间。
blackforest-tom

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

3

我在编码比赛中遇到了类似的问题,这就是我的处理方式。将所有双精度值的精度设置为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

您需要使用fixed来编写5.00,这就是为什么,您的输出将不会是5.00。

我要添加的简短参考视频链接会有所帮助


2

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

float num = 15.839;

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

1

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

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

然后打印您的双精度值。

这是一个例子:

#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;
}

1
#include<stdio.h>
int main()

{

 double d=15.6464545347;

printf("%0.2lf",d);

}

0

带模板

#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';
}

-3

只是一点点;将以下内容放在标题中

使用命名空间std;

然后

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

简化为

cout <<固定<< setprecision(2)<< d;


2
是的,它确实变得“简化了”,但是强烈建议不要这样做。请不要using namespace std;出于此目的使用-了解您这样做的原因。
卡洛斯F

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.