round関数

intを有効桁数指定で四捨五入したいのだが、もう少しまともに書けないものか・・・。

template<class T>
int round (T a,int n) {
  //aを有効桁数n桁で四捨五入
  //丸め部分がちょうど5なら偶数に丸める
  int x[64], f = 0, i = 0;
  T m = 1;
  for (;;) {
    x[i] = a%10, a /= 10;
    if (a==0) break;
    m *= 10, i++;
  }
  for (x[i+1] = 0;i>-1;i--) {
    if (n == 0) {
      if (x[i]>5) {
        a += m*10; break;
      } if (x[i]<-5) {
        a += -m*10; break;
      } if ((x[i]==5)|(x[i]==-5)) {
        n = x[i+1]%2;
        if (n) {
          a += n*m*10; break;
        }
      } else break;
    } else if (n < 0) {
      if (x[i]>0) {
        a += m*10; break;
      } if (x[i]<0) {
        a += -m*10; break;
      }
    } else  a += m*x[i], m /= 10;
    if (x[i]) f = 1;
    n -= f;
  }
  return a;
}