C++取整与保留小数位的问题与解决方法
目录
1.2.3 setiosflags(ios::scientific)
一 保留小数位的方法;
1.1 printf 格式化输出:
可以用于处理浮点数不能用于处理整数;
举例一:输入一个整数保留两位小数,再输入一个浮点数,保留三位小数;
#include <iostream>
using namespace std;
int main()
{
short a;
cin >> a;
printf("%.2f\n", a);
double b;
cin >> b;
printf("%.3f", b);
return 0;
}
运行结果:例如,依次输入4,3.67878;
4
0.00
3.67878
3.679
C:\Users\uaer\source\repos\12.25\x64\Debug\12.25.exe (进程 90000)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
1.2 setprecision用法;
1.2.0总述;
需要加头文件#include <iomanip>;
使用操作符将小数截短显示时,数据将进行四舍五入处理;
1.2.1基本格式setprecision(int n)
cout<<setprecision(int n)<<input<<endl;
含义为输出n位有效数字,注意是有效数字而不是小数位数;
直接输出或者设置精度为默认值0,都是输出六位有效数字;
代码及运行结果:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << "setprecision(int n)方法:" << endl;
cout << "无限循环小数:" << endl;
double x = 10.0 / 7;
for (int i = 0; i < 8; i++)
cout <<"保留"<<i<<"位有效数字 "
<< setprecision(i) << x << endl;
cout << "有限小数:" << endl;
double y = 10.0 / 8;
for (int i = 0; i < 6; i++)
cout << "保留" << i << "位有效数字 "
<< setprecision(i) << y << endl;
return 0;
}
运行结果:
setprecision(int n)方法:
无限循环小数:
保留0位有效数字 1
保留1位有效数字 1
保留2位有效数字 1.4
保留3位有效数字 1.43
保留4位有效数字 1.429
保留5位有效数字 1.4286
保留6位有效数字 1.42857
保留7位有效数字 1.428571
有限小数:
保留0位有效数字 1
保留1位有效数字 1
保留2位有效数字 1.2
保留3位有效数字 1.25
保留4位有效数字 1.25
保留5位有效数字 1.25
C:\Users\uaer\source\repos\12.25\x64\Debug\12.25.exe (进程 86848)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
1.2.2 setiosflags(ios::fixed)
cout<<setiosflags(ios::fixed)<<setprecision(int n)<<input<<endl;
含义为保留n位小数,注意,这里的n是n位小数的意思;
不设置精度,显示6位有效小数;
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << "setprecision(int n)方法:" << endl;
cout << "无限循环小数:" << endl;
double x = 10.0 / 7;
for (int i = 0; i < 8; i++)
cout <<"保留"<<i<<"位小数 "
<<setiosflags(ios::fixed)
<< setprecision(i) << x << endl;
cout << "有限小数:" << endl;
double y = 10.0 / 8;
for (int i = 0; i < 6; i++)
cout << "保留" << i << "位小数 "
<< setiosflags(ios::fixed)
<< setprecision(i) << y << endl;
return 0;
}
运行结果为:
setprecision(int n)方法:
无限循环小数:
保留0位小数 1
保留1位小数 1.4
保留2位小数 1.43
保留3位小数 1.429
保留4位小数 1.4286
保留5位小数 1.42857
保留6位小数 1.428571
保留7位小数 1.4285714
有限小数:
保留0位小数 1
保留1位小数 1.2
保留2位小数 1.25
保留3位小数 1.250
保留4位小数 1.2500
保留5位小数 1.25000
C:\Users\uaer\source\repos\12.25\x64\Debug\12.25.exe (进程 96368)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
1.2.3 setiosflags(ios::scientific)
cout<<setiosflags(ios::scientific)<<setprecision(int n)<<input<<endl;
含义为输出格式为科学计数法格式,保留n位小数;
不设置精度时,显示六位有效的小数位;
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << "setprecision(int n)方法:" << endl;
cout << "无限循环小数:" << endl;
double x = 1000.0 / 7;
for (int i = 0; i < 8; i++)
cout << "保留" << i << "位小数 "
<< setiosflags(ios::scientific)
<< setprecision(i) << x << endl;
cout << "有限小数:" << endl;
double y = 100.0 / 8;
for (int i = 0; i < 6; i++)
cout << "保留" << i << "位小数 "
<< setiosflags(ios::scientific)
<< setprecision(i) << y << endl;
return 0;
}
运行结果为:
setprecision(int n)方法:
无限循环小数:
保留0位小数 1e+002
保留1位小数 1.4e+002
保留2位小数 1.43e+002
保留3位小数 1.429e+002
保留4位小数 1.4286e+002
保留5位小数 1.42857e+002
保留6位小数 1.428571e+002
保留7位小数 1.4285714e+002
有限小数:
保留0位小数 1e+001
保留1位小数 1.2e+001
保留2位小数 1.25e+001
保留3位小数 1.250e+001
保留4位小数 1.2500e+001
保留5位小数 1.25000e+001
C:\Users\uaer\source\repos\12.26\x64\Debug\12.26.exe (进程 86048)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
二 取整
2.1 强制类型转换
强制类型转换分为显示类型转换和隐式类型转换;
#include <iostream>
using namespace std;
int main()
{
int x = 2.6;//隐式类型转换;
cout << "x=" << x << endl;
double y = 2.67321;//显示类型转换;
//显示类型转换的格式为static_cast<希望转换成的数据类型 只能为基本数据类型>(输入数据);
cout << "y=" << static_cast<int>(y) << endl;
return 0;
}
运行结果为:
x=2
y=2
2.2取整函数;
2.2.1四舍五入取整 round()函数;
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x = 3.1415926;
double y = 2.71828;
cout << round(x) << endl;
cout << round(y) << endl;
return 0;
}
运行结果为:
3
3
2.2.2向上取整 ceil()函数;
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x = 3.1415926;
double y = 2.71828;
cout << ceil(x) << endl;
cout << ceil(y) << endl;
return 0;
}
运行结果为:
4
3
2.2.3向下取整 floor()函数;
其实隐式类型转换也是一种向下取整;
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x = 3.1415926;
double y = 2.71828;
cout << floor(x) << endl;
cout << floor(y) << endl;
return 0;
}
运行结果为:
3
2