В двух словах: ошибки усечения.
Вы правы, с должно быть 1,0 в точной арифметике. Однако, поскольку вы использовали float в аргументах rem, вы получите ответ как float. По-видимому, b это не точно 2, а 2.0, что означает, что это двойное число, очень близкое к 2. Следовательно, b / 2 становится двойным 1.0, очевидно, в этом случае его значение немного меньше единицы, что дает вам 0 целочисленное значение. Если вы хотите предотвратить это, используйте и floor, и ceil, и сравните значения.
Если вы хотите преобразовать ответ в целое число, просто используйте round вместо floor.