2

私は現在、小さなダウンロード マネージャーをコーディングしていますが、ダウンロードの進行状況をパーセントで計算しようとすると、面白い出力が得られます。これは私がそれを計算するために使用するものです:

int progress = (byte_counter * 100) / size;
System.out.println("("+byte_counter+" * 100) = "+(byte_counter * 100)
  +" / "+size+" = "+progress);

byte-counterは int ( から読み取られた合計バイト数をカウントしますInputStream) でsizeあり、ダウンロードされたファイルの長さ (バイト単位) です。

これは、小さなダウンロードでうまく機能します。しかし、より大きなファイル (40MB) になると、おかしなことが起こり始めます。計算の出力は次のようになります。

[...]
(21473280 * 100) = 2147328000 / 47659008 = 45
(21474720 * 100) = 2147472000 / 47659008 = 45
(21476160 * 100) = -2147351296 / 47659008 = -45
(21477600 * 100) = -2147207296 / 47659008 = -45
[...]

理由はわかりませんが、計算がマイナスになります。通常の Integer は 2 31 -1 までの数値で問題ないはずなので、これは問題の根源ではありません。しかし、何が欠けていますか?

4

4 に答える 4

7

http://en.wikipedia.org/wiki/Arithmetic_overflowを参照

Java で修正するには、long代わりに a を使用してみてください。

int progress = (int) ((byte_counter * 100L) / size);

または操作の逆の順序

int progress = (int) (((float) byte_counter) / size) * 100);
于 2011-05-18T20:49:59.177 に答える
5

21476160 * 100 = 2 147 616 0002 147 483 647は、最大 intより大きいです。

あなたはあふれています。

計算に使用longします。

于 2011-05-18T20:51:11.563 に答える
3
2^31-1 = 2147483647  < 21476160 * 100 = 2147616000
于 2011-05-18T20:51:43.537 に答える
2

long を使用する必要があります -- バイナリの 2147760000 は 10000000 00000100 00110111 10000000 であり、最上位ビットが 1 であるため、負の数として解釈されます。

于 2011-05-18T20:53:44.253 に答える