Il ragionamento del *2/2 è quello di avere alla fine lo stesso numero di partenza, ma è il floor() che fa funzionare il giochetto.
Prima di ritornare al numero di partenza col /2, il floor scarta l'eventuale decimale trasformando in intero il numero raddoppiato, questo fa si che il seguente /2 porti ad un altro numero intero se si era arrivati ad un numero pari, cosa che si verifica se il numero di partenza aveva un decimale compreso tra 0.0 e 0.4, porta invece ad un numero con decimale .5 se l'intero risultante dal floor fosse dispari, cosa che accade se il numero di partenza aveva un decimale compreso tra 0.5 e 0.9.
Da notare che usando round() al posto di floor() non si avrebbe lo stesso risultato, perché round() nei casi con decimale tra .0 e .4 si comporta come floor(), ma in quelli con decimale tra .5 e .9 incrementa di 1 il numero, portando un errore di .5, rispetto al risultato che vuoi ottenere, quando si fa /2