问题
记录一下,最近遇到的带浮点数的数组求和时,结果小数点溢出/有误差/小数点不精确的问题。
场景
a = [100.7, 100.9]
print(sum(a))
# 输出:201.60000000000002
原因
Python的浮点数计算是不精确的,因为小数在以二进制形式表示时,计算机进行浮点运算时会产生浮点误差。
解决
方法一:
遇到这种问题,如果直接用内置函数 round() 设置小数点精确度的方式解决
b = round(sum(a), 2)
print(b)
# 输出:201.6
print(type(b))
# <class 'float'>
虽然这样可以解决这个问题,但是实际上在使用Python计算float类型的数据时还是可能会遇到其他问题。
方法二(推荐):
使用 decimal.Decimal 对数据类型进行转换后再计算。
from decimal import Decimal
# 只能传int或str, 不能传float, 需要对float类型转换为str, 方便点可以都转成str
c = [Decimal(str(i)) for i in a]
print(c)
# [Decimal('100.7'), Decimal('100.9')]
print(sum(c))
# Decimal('201.6')
print(float(sum(c)))
# 201.6