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

hs1ihplo  于 2023-03-05  发布在  其他
关注(0)|答案(9)|浏览(572)
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;      
}

这是输出
下一个:3284.78儿子:1784.78儿子安娜:5069.55
下一个:7193.17儿子:3908.4儿子和女儿:11101.6
出生日期:15752儿子:8558.8儿子和女儿:24310.8
出生日期:34494.5儿子:18742.5儿子姓名:53237
下一个:75537.8儿子:41043.3儿子和女儿:116581
出生日期:165417儿子:89878.7儿子姓名:255295
地址:362238儿子:196821儿子姓名:559059
出生地:793246儿子:431009儿子姓名:1.22426e+006公路
底部:1.73709e+006顶部:943845儿子姓名:2.68094e+006
底部:3.80397e+006顶部:2.06688e+006儿子和女儿:5.87085e+006公路
我想用精确的数字而不是科学的数字来显示数字。我该怎么做呢?

ut6juiuv

ut6juiuv1#

使用std::fixed流操纵器:

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

cs7cruho2#

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

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

但是,在您完成此操作后,每次在项目 * 中的任何地方打印floatdouble * 时,数字仍将以这种固定的表示法打印。

cout << scientific;

但是如果代码变得更加复杂,这可能会变得很乏味。
这就是Boost开发I/O Stream State Saver的原因,它可以自动将您正在使用的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,它可以让你的输出更容易,特别是当你必须处理国际化的时候,但是它对这个问题没有帮助。

avwztpqn

avwztpqn3#

编写下一个语法:

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

其中(n)是小数精度的数字。这应该可以修复它。
注:您需要#include <iomanip>才能使用std::setprecision

wbrvyc0a

wbrvyc0a4#

在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的作者。
yruzcnhs

yruzcnhs6#

可以按以下方式使用函数fixed
标准::cout〈〈标准::固定〈〈...
或者你可以使用printf函数,像这样的标准格式“12.12%f”:
printf(“数字= %12.12f”,浮点数);

6kkfgxo0

6kkfgxo07#

iostream提供了一整套格式化操作符,下面是一个tutorial,让你开始使用它。

mec1mxoz

mec1mxoz8#

您也可以在c++中使用printf来打印不带科学记数法的值。
因为您也可以使用cincout来代替scanfprintf,但是,如果您要输入一百万个数字并打印一百万行,则使用scanfprintf会更快。

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

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

产出

633825300114114700748351602688.000000
x9ybnkn6

x9ybnkn69#

使用此代码:

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: "<< fixed << x <<"\tSon faiz: "<<t<<"\tSon ana: "<<x+t<<endl;      
}
  • 您可以使用"〈〈fixed〈〈"来显示精确数字,而不是科学数字。
  • 这是一个小的,容易修复;)

相关问题