切り上げ
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; }
こうかな?
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; }
しかし,これだとi <= 0が上手く行かない.理由は剰余演算子の左の項が負の時に負を返すからかな?
他の言語だと,剰余の返り値が非負の実装だったりするんだけどなぁ…
例えばRubyなら:
a = 10; (-20..20).each {|i| puts("%3d -> %3d" % [i, i + a - 1 - ((i - 1) % a)])}
ということで,たぶん剰余演算子が非負を返すのならばキャスト無しかつ剰余1回で済むけど,そうでないならば実数(浮動小数点数)に持ち上げてceilを使うと.