6.10随笔(关于C语言float和double类型的精度问题)

先看下面的代码以及输出:

int main()
{
    double a = 80.845;
    float b = 80.845;
    printf("%.2lf %.2f\n", a, b);

    double c = 2.005;
    float d = 2.005;
    printf("%.2lf %.2f\n", c, d);

    double e = 2.05;
    float f = 2.05;
    printf("%.1lf %.1f\n", e, f);
    return 0;
}
Output:
80.84 80.85
2.00 2.01
2.0 2.0

众所周知,doublefloat都是浮点数,他们的输入输出格式分别对应%lf%f
由于计算机内部都是用 0 0 0 1 1 1存储数据,所以存储整数的时候不会存在精度问题,但是存储小数就会有问题了,因为 2 − 1 = 0.5 2^{-1}=0.5 21=0.5 2 − 2 = 0.25...... 2^{-2}=0.25 ... ... 22=0.25......,如果我们要存储的数为 0.7 0.7 0.7,我们是无法准确的对其进行存储的。
另外,double的精度比float高,再加上输出会默认四舍五入,结合上面的输出,我们可以猜想:2.005以double的形式存储的时候真实值小于2.005,以float的形式存的时候,其真实值略大

实际上,用代码也可以很直观的看出来:

int main()
{
    double a = 2.005;
    float b = 2.005;
    printf("%.20lf\n%.20f\n", a, b);
    return 0;
}
Output:
2.00499999999999989342
2.00500011444091796875

考虑到精度问题,接下来是围绕精度问题的一个问题:四舍五入

在以%f或者%lf输出的时候,程序会默认四舍五入,但是遇到了像上面的情况怎么办呢?
很简单,在后面加上一个略小的数即可,但是这个数也不是随便加的。我觉得,如果要保留n位小数,那么加上0.000…001(小数点后面n+2/3/4个0的位置)比较合适。这个值绝对不能太大,不然本来不进位的进位了,也不能十分小,不然没效果。

另外一种是模拟进位,使用int强转,舍弃小数部分的原理

两种方法:

int main()
{
    double a = 1.00000005;  //保留七位小数
    printf("%.7f\n", a);    //不处理精度会出错
    printf("%.7f\n", a + 0.0000000001); //方法一
    printf("%.7f\n", int(a * 10000000 + 0.5) / 10000000.0); //方法二
    return 0;
}
Output:
1.0000000
1.0000001
1.0000001
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
KepServerEX 6.10是一款领先的工业自动化通讯服务器软件。它可以与各种设备、控制器和系统进行通讯,并提供数据采集、监控和控制功能。 KepServerEX 6.10具有以下特点和优势: 1. 多种通讯协议支持:KepServerEX 6.10支持众多通讯协议,如OPC、Modbus、SNMP、DNP3等,可以与不同设备进行无缝通讯,实现数据的采集和交换。 2. 高度可扩展性:该软件具有高度可扩展性,可以支持从几个设备到数千个设备的连接,满足不同规模的工业自动化系统需求。 3. 可视化操作界面:KepServerEX 6.10提供直观的可视化操作界面,使用户可以方便地配置和管理通讯服务器,快速建立设备连接和数据传输。 4. 安全性和数据完整性保护:该软件采用最新的安全技术,包括加密和身份验证等,确保通讯过程中数据的安全和完整性。 5. 数据处理和分发功能:KepServerEX 6.10可以进行数据处理和分发,包括数据过滤、数据转换、数据聚合等功能,使得工程师和运维人员可以轻松地进行数据分析和决策。 总结来说,KepServerEX 6.10是一款功能强大的工业自动化通讯服务器软件,它能够支持多种通讯协议,具有高度可扩展性,提供安全的数据传输和处理功能,能够满足不同规模工业自动化系统的需求。使用KepServerEX 6.10可以简化设备的集成和通讯过程,提高系统的效率和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hesorchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值