double变量的四舍五入问题

问题遇到的现象和发生背景
c++中,输入一组数据计算平均数且按要求保留2位小数,大部分数据测试都正确,唯独发现在保留2位小数输出时出现了五舍六入的现象。经过多次测试后发现一个很奇怪的现象,变量类型为double时,保留12位小数且原数小数数位只比需保留数位多一位时就会出现五舍六入现象。
问题相关代码,请勿粘贴截图

#include<bits/stdc++.h>
using namespace std;
int main()
{
double n;
cin>>n;
cout << fixed << setprecision(1)<<n<<endl;
printf("%.1lf",n);
return 0;

}

运行结果及报错内容 (按要求输出保留1位小数,但是没有四舍五入)

2.15
2.1
2.1

我的解答思路和尝试过的方法

目前的测试正常的方法:
1.改变变量类型为float
2.整数部分大于或等于小数部分(如,00.000保留2位小数,需改为000.000
3.原数小数部分比需要保留的数位多1位(如,00.000保留2位小数出错,需改为00.0000)

我想要达到的结果

如何解决这个问题?实现正常的四舍五入。以及这个问题的原因

四舍六入五凑偶,你没学过怎么正确的舍入吗

你用了c++的控制函数,要加上iomanip头文件,而且你如果用了cout输出,就不需要用printf