切り上げ

x + a - ((x % a) || a);

とか:

Math.ceil(x / a) * a;

とか…

JavaScriptは良く知らないので(いや手元のFirebugを使えば良いんだけど),Cで書き直してみる:

#include <math.h>
int main() {
  int i;
  int a = 10;
  for(i = -20; i < 20; i++) {
     printf("%3d -> %3d\n", i, i + a - (i % a ? i % a : a));
  }
  printf("\n");
  for(i = -20; i < 20; i++) {
     printf("%3d -> %3d\n", i, (int)(ceil((double)i / a) * a));
  }
  return 0;
}

C code - 13 lines - codepad

こうかな?

1つ目は負の整数に対して良くわからない動作をしている(後でJavaScritptのものも書いてみるか).

整数の範囲だけで良いなら,これでも良いんじゃない?

#include <math.h>
int main() {
  int i;
  int a = 10;
  printf("\n");
  for(i = -20; i < 20; i++) {
     printf("%3d -> %3d\n", i, i + a - 1 - ((i - 1) % a));
  }
  return 0;
}

C code - 10 lines - codepad

しかし,これだとi <= 0が上手く行かない.理由は剰余演算子の左の項が負の時に負を返すからかな?

他の言語だと,剰余の返り値が非負の実装だったりするんだけどなぁ…

例えばRubyなら:

a = 10; (-20..20).each {|i| puts("%3d -> %3d" % [i, i + a - 1 - ((i - 1) % a)])}

Ruby code - 1 line - codepad

ということで,たぶん剰余演算子が非負を返すのならばキャスト無しかつ剰余1回で済むけど,そうでないならば実数(浮動小数点数)に持ち上げてceilを使うと.