何があった
大規模な給与計算システムで給与計算処理を実行したら、総支出額がマイナス21億円で出てきました。
どうしてそうなった
桁溢れしてました。
4バイトの符号ありint型だと最大の正の数値は2,147,483,647で、それに1を加えると最小のマイナス値-2,147,483,648になります。
example.java
int i = 2147483647;
System.out.println("before i=" + i); // before i=2147483647
i += 1;
System.out.println("after i=" + i); // after i=-2147483648
4バイトでの2進数の計算式を表すと
01111111111111111111111111111111 + 1 = 10000000000000000000000000000000
↓
2147483647 + 1 = -2147483648
どうすればよかった
集計した結果は思わぬ大きい値になるので、変数の型やDBのカラムの型は十分大きい値にしましょう。
ちなみにrubyだと自動で型が変わるようで桁溢れしないようです。