2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

集計したらマイナス21億になった件

Posted at

何があった

大規模な給与計算システムで給与計算処理を実行したら、総支出額がマイナス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だと自動で型が変わるようで桁溢れしないようです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?