Округление до половины не работает путем переноса округлений из младших разрядов, но просто определяет половину по данному показателю степени. Так как 3,445% 0,1 == 0,045, что меньше половины 0,1, оно будет правильно округлено до 3,4.
Вместо этого вы можете реализовать требуемые логики округления c, округлив половину до указанного десятичного числа от второе по наименьшему значению di git по отношению к данному целевому показателю в al oop:
def round_half_up_carryover(d, target_exp):
exp = Decimal(10) ** (d.as_tuple()[2] + 1)
while exp <= target_exp:
d = d.quantize(exp.normalize(), rounding=ROUND_HALF_UP)
exp *= 10
return d
, так что:
print(round_half_up_carryover(Decimal('3.445'), Decimal('0.1')))
будет выводить:
3.5