关于c++setprecision(n)和round等函数精度丢失原因

C++编程时,遇到四舍五入功能缺失,通过阅读博客发现setprecision(n)可能导致精度丢失。解决办法是在输出时加上1.0/10^(精度+1),但不同情况可能需要调整精度值,例如1.001仅部分正确,而0.0001则更准确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例题

学C语言了,可以编程解决很多问题,但没有一个C语言中的函数能完成四舍五入。
请编程解决这个问题。如输入2.055 0.154 10.159 99.999,则输出2.06 0.15 10.16 100.00。

输入格式

输入有若干行,每行一个浮点数x,都是三位小数

输出格式

输出四舍五入后的两位小数x。

输入样例

2.055
0.154
10.159
99.999
3.565

输出样例

2.06
0.15
10.16
100.00
3.57

当我用c++写好代码后……那个离谱的问题又出现了

 

代码:

#include <iostream>
#include <iomanip>
#include<cstdio>
#include<cmath>
using namespace std;

typedef unsigned long long ull;
const ull MOD=0x3f3f3f3f3f;
const double PI=3.1415926;

long long time_plus(int a,int b)
{
    long long ans=1;
    while(b)
    {
        if(b&1)
        {
            ans*=a;
        }
        a*=a;
        b>>1;
    }
    return ans;
}
int main()
{
    double x,y;
    while(cin>>x)
    {
        cout<<fixed<<setprecision(2)<<x<<endl;
    }
    return 0;
}

 找到了这老哥的博客

 这是怎么发现的,老哥真稳!

参考博客

 我们加上1.0/10^(精度+1)就能弥补这点丢失的精度!!!!!

 OHHHHHHHHHHHHHHHH!!!它一样了

#include <iostream>
#include <iomanip>
#include<cstdio>
#include<cmath>
using namespace std;

typedef unsigned long long ull;
const ull MOD=0x3f3f3f3f3f;
const double PI=3.1415926;

long long time_plus(int a,int b)
{
    long long ans=1;
    while(b)
    {
        if(b&1)
        {
            ans*=a;
        }
        a*=a;
        b>>1;
    }
    return ans;
}
int main()
{
    double x,y;
    while(cin>>x)
    {
        cout<<fixed<<setprecision(2)<<x+0.001<<endl;
    }
    return 0;
}

这里有点闹鬼,+1.001只AC了%50   按道理来说0.001应该没问题

我们将精度调至0.0001就对了,很奇怪,理论上0.001就够了,先放这里吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值