0.1+0.2≠0.3,揭秘Python自带的Bug

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 0.1+0.2≠0.3,揭秘Python自带的Bug

朋友们,问一个简单的问题:0.1+0.2=?

你肯定会说:中国人不骗中国人,0.1+0.2=0.3。

但是在Python里,0.1+0.2≠0.3 ,我们今天一起来看看这个,并且看一下解决办法。

离奇的错误

在python里编写下列代码,这个代码的含义我就不解释了,我相信即使不懂编程你也能看懂。

编写完成后,运行这个代码,你得到的结果是多少?

a=0.1
b=0.2
c=a+b
print(c) # 在屏幕上,输出这个结果

我运行这个程序的输出结果,如下图所示,👇

为什么会出现这个结果呢?

这和浮点数在计算机里的表示方法有关,不只是Python有这个问题,其实其它编程语言也这样。
感兴趣的朋友可以点赞本文,点赞满20个,我就专门写一篇文章来解释这一现象的原因。

今天我们先来看一下,出现这种问题,应该如何解决。

有点复杂的解决方法。

这种小数点计算的误差,平时我们可能也察觉不出来,但是这种微小的误差,对于金融类对数字敏感的程序,影响就很大了。

比如我之前写了一个开源项目pofinance,可以通过一行代码计算量化交易中的做T盈亏,如下图所示,👇

# pip install pofinance
import pofinance

good = pofinance.t0(11.2, 11.4, 10000) # 针对10000股,11.2买入,11.4卖出,能赚多少钱?
print(good)

其中t0的函数作用,是进行股票买入卖出的价格计算,经常会涉及到分甚至毫厘的价格计算,必须保证结果100%正确。

我是如何保证结果100%正确的呢?

使用Python里自带的库:decimal和内置函数str,比如上面0.1+0.2的代码,如果想得到正确的结果,代码可以这么写。👇

from decimal import Decimal

a = Decimal(str(0.1)) # 先把0.1转成字符串,再把字符串转成数字
b = Decimal(str(0.2)) # 同上
c = a + b
print(c)

以上代码,运行后的结果,如下图所示,👇


这个解决方法是不是有点复杂,我也觉得太复杂了。

但你还有没有更好的办法呢?欢迎在评论区交流一下~👇

相关文章
|
5月前
|
数据采集 编解码 JSON
【Python】bug汇总
【Python】bug汇总
125 0
|
4月前
|
Python
python 自带 re bug 推荐使用 regex
python 自带 re bug 推荐使用 regex
32 0
|
6月前
|
Cloud Native Go 开发者
那些年,我们一起追过的Python BUG
那些年,我们一起追过的Python BUG
21 0
|
7月前
|
人工智能 IDE 开发工具
走近Python编程的“BUG”世界
走近Python编程的“BUG”世界
38 0
|
7月前
|
Python
Python Bug分类,及异常处理
Python Bug分类,及异常处理
39 0
|
10月前
|
索引 Python
python基础之字符串、函数、BUG和异常类型介绍及类和对象详细笔记
python基础之字符串、函数、BUG和异常类型介绍及类和对象详细笔记
109 0
|
11月前
|
缓存 Java Python
惊呆了,我的 Python 代码里面出现了薛定谔的 Bug
惊呆了,我的 Python 代码里面出现了薛定谔的 Bug
70 0
|
Python
一个python小测试引发的思考---python-list尽可能少用一些,程序复杂的话,可能出bug
一个python小测试引发的思考---python-list尽可能少用一些,程序复杂的话,可能出bug
114 0
|
小程序 C# Python
【优化】C#小程序集成实现python定时段批量下载电子邮箱附件的bug排除
【优化】C#小程序集成实现python定时段批量下载电子邮箱附件的bug排除
97 0