На С++ я бы начал с такой реализации.
WARNING! Не тестировалось! Но вроде должно работать....
Код
template <typename T, typename V>
T DIV_ROUND_CLOSEST_CPP(T x, V divisor)
{
return ( T(1) > 0 || V(-1) > 0 || x > 0) ?
((x + (divisor / 2)) / divisor):
((x - (divisor / 2)) / divisor);
}
The truth is out there...