Немного иначе просто (наоборот), надо было пометить это, вдруг кому эти нюансы будут интересны.
print( math.ceil( -10.1 ) ); -- -10
print( math.floor( -10.1 ) ); -- -11
С точки зрения поставленного вопроса (отбрасывание не целой части числа, truncate) они работают не правильно.
А вообще эти функции работают правильно. Например floor - пол, т.е. округление к меньшему числу. Если представить это на координатной прямой, то меньшее целое лежит всегда левее, вот оно и в случае с отрицательными будет по модулю на еденицу больше. С ceil аналогично в случае положительных чисел.
Конечно, можно сделать более просто, (x > 0 and math.ceil(x) or math.floor(x)), чем та функция, которую я дал. Почему я дал именно ту функцию? Ну, а вдруг вопрос не правильно поставлен и ему нужно что-то другое.