Это не имеет ничего общего с javascript, округляющим числа до 0.5 или выше.
Ваша функция приращения предполагает, что x / 2 вернет целое число, но в javascript это даст десятичное число, если нечетное.Таким образом, при выполнении increment (3) вы рекурсивно вызываете increment (1.5).Как 1,5% 2 = 1,5, его не == 1, поэтому он в конечном итоге возвращает 2,5.Таким образом, в конце концов вы возвращаете 2.5 * 2 = 5.
Эта функция действительно будет работать на c ++, где, если вы работаете с целыми числами, деление обрезает конечные десятичные дроби.Тем не менее, в javascript добавление +, вычитание -, умножение *, деление /, мощность ** и по модулю% все обрабатывают числа в JavaScript как двойные.Только двоичные операторы обрабатывают числа в JavaScript как 32-разрядное целое число со знаком.