3

このような単純な除算が常に 0 を返す理由を理解するのに苦労しています。

System.out.println(4091365376L / 4091495462L * 100L);

Long として扱われるように、すべての数字の末尾に L を付けました。私はゼロを取得し続けます。

4091365376L と 4091495462L の割合を計算しようとしています。私の値はロングですが、単純な整数値を探しているだけです。

4

4 に答える 4

7

あなたは整数の丸め (実際には切り捨て) の被害者です。これを試して:

System.out.println(4091365376L * 100L / 4091495462L);

印刷し99ます。doubleまたは暗黙的にキャストします:

System.out.println(100.0 * 4091365376L / 4091495462L);

与える99.99682057572328。あなたの問題は、それらをダイビングするときに4091495462Lそれよりもわずかに大きく、結果が切り捨てられることです(確信がない場合は、試してみてください)。そして時代は…4091365376L03 / 40100

于 2012-06-18T18:55:56.390 に答える
4
4091365376L / 4091495462L * 100L
\_______________________/       |
      0.99... = 0               |
      \_________________________/
                    0

のように表現できます。

100 * 4091365376L / 4091495462L

それからそれはなるでしょう

100 * 4091365376L / 4091495462L
\_______________/              |
  409136537600L                |
  \____________________________/
          99.99... = 99  
于 2012-06-18T18:56:57.350 に答える
-1

整数演算では:

4091365376 / 4091495462 = 0
0 * 100 = 0

あなたは期待しています

4091365376 / 4091495462 = 0.9999682057572327
0.9999682057572327 * 100 = 99.99682057572327

しかし、整数 (または長整数) ではそれを行うことはできません。double 値が必要な場合は、double を使用します。

于 2012-06-18T18:59:02.080 に答える
-1

タイプと同様に、順序も重要です。long を long で割った出力は long です。実行している除算の結果は 0 であり、0 * 100 == 0 です。次のようなものを使用する方がはるかに優れています。

System.out.println((long) (4091365376.0 / 4091495462.0 * 100));
于 2012-06-18T18:57:32.397 に答える