量化金融刚结果:计算出差了一分钱的涨停价¶
量化金融用Python,最近在处理浮点问题的时候,发现一个问题,比较有意思,分享出来。
python计算79.035的四舍五入结果是79.03,这是错误的。
以下是IPython中输入程序语句,IPython能即时编译运算和输出结果。
# 计算71.85的涨停价
In [1]: 71.85 * 1.10
Out[1]: 79.035
# 涨停价四舍五入应该是79.04,但由精度损失,只有79.03。
In [2]: round(71.85 * 1.10, 2)
Out[2]: 79.03
原因分析¶
这个问题和Python语言本身无关,原因是浮点数即小数在计算机的二进制化标准有关。
所以很多计算机语言都存在浮点精度损失问题,但庆幸python已有解决方法。Python已经写出了一些库,能屏蔽下层计算机架构带来的浮点问题。
Python浮点运算的正确方法¶
Python解决浮点精度问题的办法是使用decimal库。
In [26]: from decimal import *
In [31]: print Decimal(79.035).quantize(Decimal('.01'), rounding=ROUND_HALF_UP)
79.04
为此我特地写了邮件,写出期望优矿支持引入decimal库。得到回复说优矿下一个版本中引入。
(更新:到了5月份确实可以引入decimal库了,至此问题解决)
参考¶
谈谈关于Python里面小数点精度控制的问题 http://www.cnblogs.com/herbert/p/3402245.html
Python 为什么不解决四舍五入(round)的“bug”? https://www.zhihu.com/question/20128906
python:0.1 + 0.2 == 0.3:False https://stackoverflow.com/questions/588004/is-floating-point-math-broken
round() in Python doesn’t seem to be rounding properly https://stackoverflow.com/questions/56820/round-in-python-doesnt-seem-to-be-rounding-properly
原文出自Pythonwood发表的https://blog.pythonwood.com/2017/04/Python量化之数据处理——小数浮点精度问题解决/
扩展阅读
- 微信公众平台开发(免费云BAE+高效优雅的Python+网站开放的API)
- 寒假挑战PythonTip(一人一python)总结——算法是程序的灵魂,程序员的心法
- 威佐夫博弈:取石子游戏算法——挑战PythonTip