背景:
为部门内部开发金融相关工具涉及计算,要求计算结果精度准确。但是Python由于计算机特性等固有原因,往往导致小数存在偏差。研究了解决此问题的方法。
误差原因- 二进制计算后转为十进制,存在浮点误差,一般从小数位16位开始出现。
- Python自带round函数并非金融常用四舍五入,而是银行家算法也就是四舍六入五留双,需要转换为精确的四舍五入。
- 对计算过程中出现的所有数值进行截位,具体的截位方法和长度可以自行判定,在浮点误差之前截位即可,我一般是截10位。这样可以抵消掉浮点误差。
- 具体的截位可以使用decimal类型的quantitize方法,注意四舍五入方法也需要指定为“ROUND_HALF_UP”
- 最终展示时再次使用Decimal类的Quantize方法按需要保留小数。