如何使C ++ cout不使用科学记数法

时间:2011-03-06 17:13:38

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

double x = 1500;
for(int k = 0; k<10 ; k++){
    double t = 0;
    for(int i=0; i<12; i++){
        t += x * 0.0675;
        x += x * 0.0675;
    }
    cout<<"Bas ana: "<<x<<"\tSon faiz: "<<t<<"\tSon ana: "<<x+t<<endl;      
}

这是输出

  

Bas ana:3284.78 Son faiz:1784.78 Son ana:5069.55

     

Bas ana:7193.17 Son faiz:3908.4 Son ana:11101.6

     

Bas ana:15752 Son faiz:8558.8 Son ana:24310.8

     

Bas ana:34494.5 Son faiz:18742.5 Son ana:53237

     

Bas ana:75537.8 Son faiz:41043.3 Son ana:116581

     

Bas ana:165417 Son faiz:89878.7 Son ana:255295

     

Bas ana:362238 Son faiz:196821 Son ana:559059

     

Bas ana:793246 Son faiz:431009 Son ana:1.22426e + 006

     

Bas ana:1.73709e + 006 Son faiz:943845 Son ana:2.68094e + 006

     

Bas ana:3.80397e + 006 Son faiz:2.06688e + 006 Son ana:5.87085e + 006

我希望数字用精确数字显示而不是科学数字。我怎么能这样做?

8 个答案:

答案 0 :(得分:75)

使用std::fixed流操纵器:

cout<<fixed<<"Bas ana: "<<x<<"\tSon faiz: "<<t<<"\tSon ana: "<<x+t<<endl;

答案 1 :(得分:19)

如上所述,您可以使用std :: fixed来解决您的问题,如下所示:

cout << fixed;
cout << "Bas ana: " << x << "\tSon faiz: " << t << "\tSon ana: " << x+t <<endl;

但是,完成此操作后,每次在项目中的任何位置打印浮动或双 时,该数字仍将以此固定表示法打印。您可以使用

将其关闭
cout << scientific;

但如果您的代码变得更复杂,这可能会变得乏味。

这就是Boost制作 I / O流状态保护程序的原因,它会自动将您正在使用的I / O流返回到函数调用之前的状态。您可以像这样使用它:

#include <boost/io/ios_state.hpp> // you need to download these headers first

{
    boost::io::ios_flags_saver  ifs( os );

    cout << ios::fixed;
    cout<<"Bas ana: "<<x<<"\tSon faiz: "<<t<<"\tSon ana: "<<x+t<<endl;

} // at this bracket, when ifs goes "out of scope", your stream is reset

您可以在the official docs中找到有关Boost的I / O流状态保护程序的更多信息。

您可能还想查看Boost Format library,这也可以让您的输出更轻松,特别是如果您必须处理国际化。但是,对于这个特殊问题,它无济于事。

答案 2 :(得分:2)

您可以使用格式标记

更多信息:http://www.cplusplus.com/reference/iostream/ios_base/fmtflags/

答案 3 :(得分:2)

编码下一个语法:

i = 0
while (i < <num_images>) {
    //your code here
}

其中std::cout << std::fixed << std::setprecision(n); 是十进制精度的数字。 这应该可以解决。

答案 4 :(得分:1)

使用iostream可以获得一整套格式化操作符。这是一个tutorial,可以帮助您入门。

答案 5 :(得分:1)

在C ++ 20中,您将可以使用std::format来做到这一点:

std::cout << std::format("Bas ana: {:f}\tSon faiz: {:f}\t"
                         "Son ana: {:f}\n", x, t, x + t);

输出:

Bas ana: 3284.776791    Son faiz: 1784.776791   Son ana: 5069.553581
Bas ana: 7193.172376    Son faiz: 3908.395585   Son ana: 11101.567961
...

此方法的优点是它不会更改流状态。

在此期间,您可以使用the {fmt} librarystd::format是基于。 {fmt}还提供了print功能,使此操作变得更加轻松和高效(godbolt):

fmt::print("Bas ana: {:f}\tSon faiz: {:f}\tSon ana: {:f}\n", x, t, x + t);

免责声明:我是{fmt}和C ++ 20 std::format的作者。

答案 6 :(得分:0)

您可以通过以下方式使用功能固定

  

std :: cout << std :: fixed << ...

或者您可以通过这种方式将printf函数用于标准格式,例如“ 12.12%f”:

  

printf(“数字=%12.12f”,float_number);

答案 7 :(得分:0)

您还可以在c ++中使用@react-native-firebase/messaging打印值,而无需科学记数法。

因为您也可以使用:react-native-firebase_messaging has not defined a default in project.ext.'react-native'.versions.android.compileSdk in its build.gradle file. printf代替cincout,但是,如果您要输入一百万个数字并打印一百万行,使用scanfprintf更快。

scanf

输出

printf