Python浮点数数组求和结果不精确问题

问题

        记录一下,最近遇到的带浮点数的数组求和时,结果小数点溢出/有误差/小数点不精确的问题。

场景

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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amour_柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值