量化金融刚结果:计算出差了一分钱的涨停价

量化金融用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



原文出自发表的https://blog.pythonwood.com/2017/04/Python量化之数据处理——小数浮点精度问题解决/



扩展阅读