python四舍五入的最佳方法

真要疯掉了,下面那个失败的方法其实就差了一步,没有将数字用字符串方式储存,因此精度误差一直都存在,害的我后面搞了那么复杂的一个方法

这是正确的方法:

from decimal import Decimal, ROUND_HALF_UP
def round_dec(n, d=2):
    s = '0.' + '0' * d
    return Decimal(str(n)).quantize(Decimal(s), rounding=ROUND_HALF_UP)

>>>print(round_dec(3.585,2))
>>>3.59









后面这些就不要看了,伤身

失败:

from decimal import Decimal, ROUND_HALF_UP
def round_dec(n, d=2):
    s = '0.' + '0' * d
    return Decimal(n).quantize(Decimal(s), rounding=ROUND_HALF_UP)

>>>print(Decimal(3.585))
>>>3.58499999999999996447286321199499070644378662109375
>>>print(round_dec(3.585,2))
>>>3.58

成功:

def round_dec(n, d=2):
    t = 0
    if n < 0.1 and n > 0:
        t = 1
        n = n + t
    elif n < 0 and n > -0.1:
        t = -1
        n = n + t

    if n >= 1:
        l = len(str(int(n))) + d
    elif n >= 0 and n < 1:
        l = d
    elif n < 0:
        l = len(str(int(n))) + d - 1

    return Context(prec=l, rounding=ROUND_HALF_UP).create_decimal(str(n)) - t

>>>print(round_dec(3.585,2))
>>>3.59
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值