洛谷 P5706 【深基2.例8】再分肥宅水

题目连接:

P5706 【深基2.例8】再分肥宅水 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 

我提交的:

 1 #include
 2 #include
 3 using namespace std;
 4 int main(){
 5     float a;
 6     int b;
 7     cin >> a >> b;
 8     
 9     cout << setprecision(3) << a / b << endl;
10     cout << b * 2 << endl;
11 }

然而,只有一个AC,思考良久,不知为何而错。无奈看了看题解,发现人家比我多了一个"fixed"。那这个"fixed"到底是什么呢?

网上寻找了一圈,看见人家说:“如果一个数字太大,无法使用 setprecision 指定的有效数位数来打印,则许多系统会以科学表示法的方式打印。”

经过尝试后,发现果真如此:

 

所以应该加上fixed来控制位数。

那么,为什么setprecision不能这样输出呢?我又找了一圈,我发现我对setprecision的理解完全错了。

我过去曾认为:setprecision就是传统意义上,按照我们人脑控制的小数点位数。结果好像跟setw一样的效果,都是控制总有效位数?

 

现在,问题来到了setw和setprecision的区别:

setw(n): 右对齐,不够位数左边加空格,可以用setfill()来控制左边填充的东西

setprecision(n): 左对齐,不够位数不填充,对于小数点后的0会自动省略。

    double a = 123.321;
    double b = 32.21;
    //cin >> a >> b;
    double num = a / b;
    cout << "结果:" << endl;
    cout << fixed << setw(6) << num << endl;    //看看是不是对setw有效
    cout << setprecision(6) << num << endl;
    cout << num << endl;        //看看是不是对下面也有效
    cout << setprecision(2) << num << endl;
    cout << num << endl;        //确实有效
    cout << setprecision(1) << num << endl;
  cout.setf(ios::fixed);  //加上这一句也可以
结果:
3.828656
3.828656
3.828656
3.83
3.83
3.8

D:\C++程序\try1\Debug\try1.exe (进程 63548)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

结论:加上fixed后,经过尝试,setpricision可以控制小数位数,但是setw却不行。

 

总结:

  1. 如果cout要控制小数点位数,那么使用setprecision时要加上fixed;
  2. fixed对setprecision都有效果,对setw没有。
  3. setw只对下一个输出值有效,而setprecision对后面的输出都有效。

 

你可能感兴趣的:(洛谷 P5706 【深基2.例8】再分肥宅水)