题目连接:
P5706 【深基2.例8】再分肥宅水 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
我提交的:
1 #include<iostream> 2 #include<iomanip> 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却不行。
总结:
- 如果cout要控制小数点位数,那么使用setprecision时要加上fixed;
- fixed对setprecision都有效果,对setw没有。
- setw只对下一个输出值有效,而setprecision对后面的输出都有效。