Округляет он правильно. Числа хранит "неправильно". Это связано с тем, как float хранится в памяти. Во многих языках программирования есть такая проблема, что якобы ровное число, будучи float становится больше или меньше целого на один бит.
Как этого избежать не знаю. Когда сам с этим столкнулся, сделал костыль в виде конвертирования числа в строку, почему-то некоторые строковые функции умеют обходить эту проблему.