python浮点数运算误差,python 浮点数精确运算float有误差

浮点数一个普遍的问题就是在计算机的世界中,浮点数并不能准确地表示十进制。并且,即便是最简单的数学运算,也会带来不可控制的后果。因为,在计算机的世界中只认识0与1。

>>> x =4.20>>> y =2.10>>> x + y6.3000000000000007>>> (x+y) ==6.3False>>> x =1.2>>> y =2.3>>> x + y3.5>>> (x + y) ==3.5True

上述种种问题,就来自于计算机的cpu与浮点数的表示方式,我们自己在代码层面是没法控制的。在有些需要精确表示浮点数的场合,例如财务结算,这些误差就不可接受。

python中的decimal模块可以解决上面的烦恼

decimal模块中,可以通过整数,字符串或原则构建decimal.Decimal对象。如果是浮点数,特别注意因为浮点数本身存在误差,需要先将浮点数转化为字符串。

>>> fromdecimalimportDecimal>>> fromdecimalimportgetcontext>>> Decimal('4.20') + Decimal('2.10')Decimal('6.30')>>> fromdecimalimportDecimal>>> fromdecimalimportgetcontext>>> x =4.20>>> y =2.10>>> z = Decimal(str(x)) + Decimal(str(y))>>> zDecimal('6.3')>>> getcontext().prec =4#设置精度>>> Decimal('1.00') /Decimal('3.0')Decimal('0.3333')

当然精度提升的同时,肯定带来的是性能的损失。在对数据要求特别精确的场合(例如财务结算),这些性能的损失是值得的。但是如果是大规模的科学计算,就需要考虑运行效率了。毕竟原生的float比Decimal对象肯定是要快很多的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值