87
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 儿子 faiz: 1784.78 儿子 ana: 5069.55

Bas ana: 7193.17 儿子 faiz: 3908.4 儿子 ana: 11101.6

Bas ana: 15752 儿子 faiz: 8558.8 儿子 ana: 24310.8

Bas ana: 34494.5 儿子 faiz: 18742.5 儿子 ana: 53237

Bas ana: 75537.8 儿子 faiz: 41043.3 儿子 ana: 116581

Bas ana: 165417 儿子 faiz: 89878.7 儿子 ana: 255295

姓名:362238 儿子 faiz:196821 儿子姓名:559059

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

Bas ana: 1.73709e+006 儿子 faiz: 943845 儿子 ana: 2.68094e+006

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

我希望数字显示为精确数字而不是科学数字。我怎样才能做到这一点?

4

8 回答 8

120

使用std::fixed流操纵器:

cout<<fixed<<"Bas ana: "<<x<<"\tSon faiz: "<<t<<"\tSon ana: "<<x+t<<endl;
于 2011-03-06T17:19:47.973 回答
36

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

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

但是,完成此操作后,每次在项目中的任何位置float打印 a或 a时,仍会以这种固定的符号打印数字。您可以使用double

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

您可以在官方文档中找到有关 Boost 的 I/O Stream State Saver 的更多信息。

您可能还想查看Boost Format 库,它也可以使您的输出更容易,尤其是在您必须处理国际化的情况下。但是,它不会帮助您解决这个特定问题。

于 2011-03-06T20:13:36.557 回答
13

编码下一个语法:

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

其中(n)是小数精度数。这应该解决它。

ps:您需要#include <iomanip>才能使用std::setprecision.

于 2018-11-27T08:55:40.713 回答
7

在 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

于 2020-12-16T01:22:39.057 回答
3

您可以使用格式标志

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

于 2011-03-06T17:16:50.953 回答
1

您可以使用 iostream 获得一整套格式化运算符。这是一个帮助您入门的教程。

于 2011-03-06T17:19:08.637 回答
1

您可以使用这种方式固定的功能:

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

或者您可以通过以下方式使用具有标准格式的 printf 函数,例如“12.12%f”:

printf ("number = %12.12f", float_number);

于 2019-12-16T23:20:50.830 回答
0

您也可以printf在 c++ 中使用不使用科学计数法打印值。

As 您也可以使用cinandcout代替scanfand printf,但是,如果您将一百万个数字作为输入并打印一百万行,则使用scanfand会更快printf

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

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

输出

633825300114114700748351602688.000000

于 2020-09-05T09:15:00.037 回答