Попробовал с типом 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
>>>