1. Округление к чётному. Это стандартное округление к ближайшему; если расстояние одинаково — то к чётному.
4,4 → 4
4,5 → 4
4,6 → 5
−4,4 → −4
−4,5 → −4
−4,6 → −5
5,4 → 5
5,5 → 6
5,6 → 6
−5,4 → −5
−5,5 → −6
−5,6 → −6
2. Округление вниз к −∞. Округление к меньшему.
4,xxx → 4 (при любой дробной части)
−4,xxx → −5
3. Округление вверх к +∞. Округление к бóльшему.
4,xxx → 5
−4,xxx → −4
4. Отбрасывание дробной части. Округление к 0. Округление к меньшему по модулю.
4,xxx → 4
−4,xxx → −4
Столько много знаков у double — так что где-то в недрах библиотеки float стал double’ом. Знаков у float не точно 7, а чуть больше семи. И это число действительно не тройка: тройка имеет 16-й вид 4040.0000, а ваше число — 403F.FFFF. Как вы видите, величина единицы младшего разряда (ULP) на таких величинах будет около 2,4·10−7 — поболее семи знаков будет, но до восьми не дотягивает.
Механизмы округления IEEE 754 не имеют никакого отношения к десятичному округлению, прописанному в библиотеке языка. Округление IEEE на самом деле двоичное и используется при переводе из более точного типа в менее точный, или чтобы округлить результат умножения/деления.