输入 0.000000345000 输出这个数除以23,保留8位小数四舍五入。
正确结果是 0.00000002,我的结果是0.00000001。
附上我的代码
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); 可是我修改之后任然不行。
请问错在哪,我该如何更正?
感谢大佬赐教
```cpp
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的数据,非常感谢)。
因为他是直接丢弃而不是四舍五入的。
可以这么写:
a *= 100000000;
a += 0.5;
a /= 100000000;
再输出
可以说成是cin输入小数时会丢弃第八位小数之后的东西吗?
@Pisces_T: 肯定不能啊,如果是这样,那你改为9之后输出就不是0.000...15了,而是0.0000000010
@wowpH: 那精度丢失时是在哪个环节出错了
@Pisces_T: 最后输出的时候
那乘了又除了之后 第9位的5不也是被舍弃了么
@Pisces_T: 但是输出就不是0.00000001了而是0.00000002。这不就是你想要的吗?
@wowpH: 输入a的值为0.00000034500 除以23后 第9位的5就不会四舍五入了。 我没描述清楚
搞不懂你想要什么。
@wowpH: 谢谢你,我明白了