真要疯掉了,下面那个失败的方法其实就差了一步,没有将数字用字符串方式储存,因此精度误差一直都存在,害的我后面搞了那么复杂的一个方法
这是正确的方法:
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