このような単純な除算が常に 0 を返す理由を理解するのに苦労しています。
System.out.println(4091365376L / 4091495462L * 100L);
Long として扱われるように、すべての数字の末尾に L を付けました。私はゼロを取得し続けます。
4091365376L と 4091495462L の割合を計算しようとしています。私の値はロングですが、単純な整数値を探しているだけです。
このような単純な除算が常に 0 を返す理由を理解するのに苦労しています。
System.out.println(4091365376L / 4091495462L * 100L);
Long として扱われるように、すべての数字の末尾に L を付けました。私はゼロを取得し続けます。
4091365376L と 4091495462L の割合を計算しようとしています。私の値はロングですが、単純な整数値を探しているだけです。
あなたは整数の丸め (実際には切り捨て) の被害者です。これを試して:
System.out.println(4091365376L * 100L / 4091495462L);
印刷し99
ます。double
または暗黙的にキャストします:
System.out.println(100.0 * 4091365376L / 4091495462L);
与える99.99682057572328
。あなたの問題は、それらをダイビングするときに4091495462L
それよりもわずかに大きく、結果が切り捨てられることです(確信がない場合は、試してみてください)。そして時代は…4091365376L
0
3 / 4
0
100
4091365376L / 4091495462L * 100L
\_______________________/ |
0.99... = 0 |
\_________________________/
0
のように表現できます。
100 * 4091365376L / 4091495462L
それからそれはなるでしょう
100 * 4091365376L / 4091495462L
\_______________/ |
409136537600L |
\____________________________/
99.99... = 99
整数演算では:
4091365376 / 4091495462 = 0
0 * 100 = 0
あなたは期待しています
4091365376 / 4091495462 = 0.9999682057572327
0.9999682057572327 * 100 = 99.99682057572327
しかし、整数 (または長整数) ではそれを行うことはできません。double 値が必要な場合は、double を使用します。
タイプと同様に、順序も重要です。long を long で割った出力は long です。実行している除算の結果は 0 であり、0 * 100 == 0 です。次のようなものを使用する方がはるかに優れています。
System.out.println((long) (4091365376.0 / 4091495462.0 * 100));