C/C++中浮点数输出精度的问题

本文使用C++语言书写,对于C的小伙伴们,如果编译不通过的话……就说明C里面没有这个内容,可以跳过

通常来说,我们书写程序主要只用整形变量

(signed/unsigned) (long/long long/short) int a;

但是有时候,我们又需要一些小数运算。
所以就会出现

float b;
double c;
long double d;

至于具体使用方法……自行度娘。这里需要注意一下浮点数是有精度的
计算机中的数据是用二进制存储的。
十进制小数怎么转换为二进制小数呢?
举个栗子

(0.5)10=(0.1)2(0.25)10=0.012

我们是怎么知道的呢?
推理一下,

(0.5)10×(2)10=(1)10(0.5)10=(1)10÷(2)10=(1)2÷(10)2=(0.1)2

然后再根据以下度娘的方法,对于十进制小数,每次乘以2,然后取整数位(0/1),就可以得到二进制下的小数
比如

但是我们也要知道,并不是所有小数乘以2的有限次幂就能得到整数的
比如(0.8)10,如果小伙伴们自行转换一下,就会发现(0.8)10=(0.110011001100)2
是不是无限循环?
但是计算机也不能无限表示啊
他就只能截断到某一位,这就会产生精度误差
比如,(0.8)10在计算机中存储的是(0.110011001100)2,当然实际上他存储的位数更多,所以误差更小
那么(0.110011001100)2转换回十进制就是(好难算啊)

(0.110011001100)2=(1×21+1×22+0×23+0×24+)10=(0.79980468750000000000)10

这个误差就是这样产生的。但是一般输出的时候由于误差太小,都会给你四舍五入。
这就是为什么很多题都是叫你保留三位小数,因为float三位之后就会有误差,对于不同的方法输出的结果不同。


那么对于浮点数的输出格式,也很简单啦
我们可以

printf("%.3f", x);

这里.3其实就是0.3, 表示。。。表示

也可以

cout << fixed << setprecision(3);
cout << x << endl;

这里fixed是强制小数输出,否则的话……你可能会看到3.42344856131e-31这样的结果,其实他是精度误差下的0
setprecision(int)就是设置从此以后cout输出的数据都带有int位小数位,不足补0

posted @   IdanSuce  阅读(1164)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示