Python 中的浮点数比较,以及 decimal 模块

结论

先说 2 个结论:

  1. 在 Python 中比较浮点数的大小时,必须先用 round() 进行圆整,再比较大小。否则可能出错。
  2. 如果对精度要求很高,可以使用 decimal 模块。

1. 一个简单示例

理论上,1.1 + 2.2 > 3.3 应该返回布尔值 False,但是实际结果并非如此。如下图所示。
在使用 round 之后可以得到正确的结果。
在这里插入图片描述
出现上图错误的原因,是因为计算机中的小数是不精确的。

2. Python 中的浮点数表达

Python 中的浮点数,实际上是用 2 个整数相除来表达。用 float.as_integer_ratio() 可以查看这 2 个整数。如下图。
在这里插入图片描述
用 float.as_integer_ratio(),可以知道为什么 1.1 + 2.2 会有误差。
在这里插入图片描述

产生上面的情况,是因为计算机本身的特性,即计算机无法精确表达浮点数,只能精确表达整数。简单来说是:
假设一个计算机,只用 2 个 bit 来表示数字,那么它可以表示为 00, 01, 10, 11 ,可以精确表达 [0, 1, 2, 3] 共 4 个整数。但是因为 0 到 3 之间的小数是无穷个(实际上 0 到 1 之间的小数已经是无穷),所以它无法精确地表达小数。
现代计算机很多是 32 位或 64 位,虽然它可以精确地表达更多的整数,但是同样无法表达无穷的小数,因此必然会有误差。

3. 浮点数的有效位数

在使用 round 取整时,需要根据自己的数据情况,来确定对小数点后多少位进行取整。
并且要注意,x86-64 系统的浮点数有 17 位有效数字 significant digits。有效数字从左边第一位非 0 数字开始算起。如下图是在 64 位 Ubuntu 系统下测试的结果。
在这里插入图片描述

4. decimal 模块

如果是对小数点后精度要求很高的场景,可以使用 decimal 模块。如下示例。
这些高精度场景包括财务方面的计算,或是要设计一个计算器程序等场景。
在这里插入图片描述
另外,如果只是要比较 2 个浮点数是否相等,也可以使用 numpy.isclose 函数。

isclose

5. 参考资料

更多关于浮点数的讨论,可以参看 Python 官网:
https://docs.python.org/3/tutorial/floatingpoint.html#

—————— 本文结束 ——————

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值