首页 新闻 会员 周边 捐助

double 精度丢失

0
悬赏园豆:20 [已解决问题] 解决于 2019-11-27 18:27

输入 0.000000345000 输出这个数除以23,保留8位小数四舍五入。
正确结果是 0.00000002,我的结果是0.00000001。
附上我的代码

include<iostream>

include<iomanip>

using namespace std;
int main()
{
double a;
cin>>a;
cout<<setiosflags(ios::fixed)<<setprecision(8)<<a/23;
return 0;
}
我使用的是 dev c++,我增加了一位小数成9位后,结果为 0.000000015 ,可是为什么8位的时候没有四舍五入呢?
我在网上查找了一下,说是把输入改成 scanf("%15Ld",&a); 可是我修改之后任然不行。
请问错在哪,我该如何更正?

感谢大佬赐教

Pisces_T的主页 Pisces_T | 初学一级 | 园豆:188
提问于:2019-11-25 20:46
< >
分享
最佳答案
0

```cpp

include<iostream>

include<cstdio>

include<iomanip>

using namespace std;
int main()
{
double f=19.755;
cout<<f<<endl;
printf("%.20lf\n",f);
long double x=0.34500;
long double y=23;
printf("%.20Lf\n%.20Lf\n%.20Lf\n",x,y,x/y);
printf("%.8Lf",x/y);
double z=0.000000072212221;
cout<<endl<<setiosflags(ios::fixed)<<setprecision(8)<<z/2;
return 0;
}
然后输出

19.755
19.75499999999999900524
0.34499999999999997335
23.00000000000000000000
0.01499999999999999884
0.01500000
0.00000004

首先我在网上看到找到了19.755实际上保存的时候是无法精确保存的,会变成19.75499999999999900524 同理,我试了一下我的数据 发现得到的是这个 0.34499999999999997335 ,那么我发现实际上 第9位的5是四舍五入后的结果,而第8位之后实际为4,所以不舍入。
总的来说这是因为有些实数保存时是无法精确保存的,所以,我们只能曲所需要的精确度。
本问题可以考虑乘1e7 让3跑到整数位置,改变小数位置储存的东西,后面保存 0.45 ,最后再除以1e7. ----->(非常感谢 wowpH 提供的想法,以及我在网上找到的19.755的数据,非常感谢)。

Pisces_T | 初学一级 |园豆:188 | 2019-11-27 18:24
其他回答(1)
0

因为他是直接丢弃而不是四舍五入的。
可以这么写:
a *= 100000000;
a += 0.5;
a /= 100000000;
再输出

收获园豆:20
wowpH | 园豆:226 (菜鸟二级) | 2019-11-27 12:37

可以说成是cin输入小数时会丢弃第八位小数之后的东西吗?

支持(0) 反对(0) Pisces_T | 园豆:188 (初学一级) | 2019-11-27 16:24

@Pisces_T: 肯定不能啊,如果是这样,那你改为9之后输出就不是0.000...15了,而是0.0000000010

支持(0) 反对(0) wowpH | 园豆:226 (菜鸟二级) | 2019-11-27 16:29

@wowpH: 那精度丢失时是在哪个环节出错了

支持(0) 反对(0) Pisces_T | 园豆:188 (初学一级) | 2019-11-27 16:31

@Pisces_T: 最后输出的时候

支持(0) 反对(0) wowpH | 园豆:226 (菜鸟二级) | 2019-11-27 16:32

那乘了又除了之后 第9位的5不也是被舍弃了么

支持(0) 反对(0) Pisces_T | 园豆:188 (初学一级) | 2019-11-27 16:39

@Pisces_T: 但是输出就不是0.00000001了而是0.00000002。这不就是你想要的吗?

支持(0) 反对(0) wowpH | 园豆:226 (菜鸟二级) | 2019-11-27 16:40

@wowpH: 输入a的值为0.00000034500 除以23后 第9位的5就不会四舍五入了。 我没描述清楚

支持(0) 反对(0) Pisces_T | 园豆:188 (初学一级) | 2019-11-27 16:43

搞不懂你想要什么。

支持(1) 反对(0) wowpH | 园豆:226 (菜鸟二级) | 2019-11-27 16:45

@wowpH: 谢谢你,我明白了

支持(0) 反对(0) Pisces_T | 园豆:188 (初学一级) | 2019-11-27 18:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册