Попробовал с типом Decimal, округление тоже идёт к чётным значениям
последней цифры, но хотя бы однообразно. Попробовал, как в школе
учили, через int(x + 0.5),
получилось как учили в школе (отрицательные не рассматривал)
from decimal import Decimal as Dc print('{i} {x3} {x2} {x1} {x0} {x3:.3f} {x2:.2f} {x1:.1f} {x0:.0f} ' '{int(x0 + 0.5)}') for i in range(10): x3 = float(f'0.00{i}5') x2 = float(f'0.0{i}5') x1 = float(f'0.{i}5') x0 = float(f'{i}.5') print(f' {i} {x3} {x2} {x1} {x0} {x3:.3f} {x2:.2f} ' f'{x1:.1f} {x0:2.0f} {int(x0 + 0.5):5}') print('\n{i} {x3} {x2} {x1} {x0} {x3:.3f} {x2:.2f} {x1:.1f} {x0:.0f} ' '{int(x0 + 0.5)}') for i in range(10): x3 = Dc(f'0.00{i}5') x2 = Dc(f'0.0{i}5') x1 = Dc(f'0.{i}5') x0 = Dc(f'{i}.5') print(f' {i} {x3} {x2} {x1} {x0} {x3:.3f} {x2:.2f} ' f'{x1:.1f} {x0:2.0f} {int(x0 + Dc(0.5)):5}')
Получаем
>>> *** Remote Interpreter Reinitialized *** {i} {x3} {x2} {x1} {x0} {x3:.3f} {x2:.2f} {x1:.1f} {x0:.0f} {int(x0 + 0.5)} 0 0.0005 0.005 0.05 0.5 0.001 0.01 0.1 0 1 1 0.0015 0.015 0.15 1.5 0.002 0.01 0.1 2 2 2 0.0025 0.025 0.25 2.5 0.003 0.03 0.2 2 3 3 0.0035 0.035 0.35 3.5 0.004 0.04 0.3 4 4 4 0.0045 0.045 0.45 4.5 0.004 0.04 0.5 4 5 5 0.0055 0.055 0.55 5.5 0.005 0.06 0.6 6 6 6 0.0065 0.065 0.65 6.5 0.006 0.07 0.7 6 7 7 0.0075 0.075 0.75 7.5 0.007 0.07 0.8 8 8 8 0.0085 0.085 0.85 8.5 0.009 0.09 0.8 8 9 9 0.0095 0.095 0.95 9.5 0.009 0.10 0.9 10 10 {i} {x3} {x2} {x1} {x0} {x3:.3f} {x2:.2f} {x1:.1f} {x0:.0f} {int(x0 + 0.5)} 0 0.0005 0.005 0.05 0.5 0.000 0.00 0.0 0 1 1 0.0015 0.015 0.15 1.5 0.002 0.02 0.2 2 2 2 0.0025 0.025 0.25 2.5 0.002 0.02 0.2 2 3 3 0.0035 0.035 0.35 3.5 0.004 0.04 0.4 4 4 4 0.0045 0.045 0.45 4.5 0.004 0.04 0.4 4 5 5 0.0055 0.055 0.55 5.5 0.006 0.06 0.6 6 6 6 0.0065 0.065 0.65 6.5 0.006 0.06 0.6 6 7 7 0.0075 0.075 0.75 7.5 0.008 0.08 0.8 8 8 8 0.0085 0.085 0.85 8.5 0.008 0.08 0.8 8 9 9 0.0095 0.095 0.95 9.5 0.010 0.10 1.0 10 10 >>>