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


75
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孙法兹(Faiz):8558.8孙正义(ana):24310.8

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

安娜:75537.8儿子·法兹:41043.3儿子·安娜:116581

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

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

安娜:793246儿子faiz:431009儿子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
您为什么要投射doubledouble
Fred Foo

Answers:



30

如上所述,您可以std::fixed用来解决问题,例如:

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

但是,完成此操作后,每次在项目中打印一个floatdouble 任意位置时,该数字仍将以此固定符号打印。您可以使用

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

您可以在官方文档中找到有关Boost的I / O流状态保护程序的更多信息。

您可能还想检查一下Boost Format库,该也可以使您的输出更加容易,尤其是在您必须处理国际化问题时。但是,它对这个特定问题没有帮助。





1

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

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

或者,您可以通过以下方式将printf函数与“ 12.12%f”之类的标准格式一起使用:

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


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
...

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

在此期间,您可以使用的{} FMT库std::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


0

您也可以printf在c ++中使用它来打印没有科学符号的值。

因为您也可以使用cincout而不是scanfprintf,但是,如果您要输入一百万个数字并打印一百万行,则使用scanf和会更快printf

#include<stdio.h>
#include<math.h>

  int main () { 
  double a = pow(2,99); 
  printf ("%lf\n",a); 
  return 0; 
  }

输出量

633825300114114700748351602688.000000

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.