web-dev-qa-db-ja.com

Javaの整数の除算

これは基本的な質問ですが、答えが見つかりません。私は浮動小数点演算と他のいくつかのトピックを調べましたが、これに対処するものは何もありませんでした。間違った用語を持っているに違いない。

基本的に、2つの数量(完了済みと合計)を取得し、それらを分割して(完了した量の)割合を求めます。数量はlongsです。セットアップは次のとおりです。

long completed = 25000;
long total = 50000;

System.out.println(completed/total);  // Prints 0

結果をdoubleに再割り当てしようとしました-0.0を出力します。どこがおかしいの?

ちなみに、次のステップはこの結果に100を掛けることです。この小さなハードルが乗り越えられたら、これは簡単だと思います。

ところで、ここでの宿題ではなく、単なる昔ながらのnumskull-ness(そしておそらく今日のコーディングが多すぎる)。

84
Ben

outputの変換は遅すぎます。計算は既に整数演算で行われています。 inputsdoubleに変換する必要があります。

System.out.println((double)completed/(double)total);

実際に入力のbothを変換する必要はないことに注意してください。それらの1つがdoubleである限り、もう1つは暗黙的に変換されます。しかし、私は対称性のために両方を行うことを好みます。

123

これにはダブルスも必要ありません。 100 firstを掛けてから割ります。そうしないと、結果は1未満になり、見たとおりゼロに切り捨てられます。

編集:またはオーバーフローが発生する可能性がある場合、オーバーフローする場合(つまり、配当が922337203685477581を超える場合)、最初に除数を100で除算します。

8
harold

completedtotalの両方をdoubleに変換するか、少なくとも分割を行うときにそれらをdoubleにキャストします。つまり結果だけでなく、変数を2倍にキャストします。

公正な警告です。floatおよびdoubleを使用する場合、 浮動小数点精度の問題 があります。

3
Ali
In Java
Integer/Integer = Integer
Integer/Double = Double//Either of numerator or denominator must be floating point number
1/10 = 0
1.0/10 = 0.1
1/10.0 = 0.1

どちらかをタイプキャストするだけです。

2
Bhavya Jain

除算を行う前に、2つの値のいずれかを明示的にfloatにキャストしない場合、整数除算が使用されます(そのため、0が返されます)。通常の除算が使用されるように、2つのオペランドの1つが浮動小数点値である必要があります(他の整数値は自動的にfloatに変換されます)。

試してみてください

float completed = 50000.0f;

そしてそれは大丈夫です。

1
Jack

JLS で説明されているように、整数演算は非常に簡単です。

シフト演算子以外の整数演算子にlong型のオペランドが少なくとも1つある場合、演算は64ビット精度を使用して実行され、数値演算子の結果はlong型になります。もう一方のオペランドが長くない場合、最初に数値の昇格(§5.6)でlong型に拡張されます(§5.1.5)。

それ以外の場合、演算は32ビット精度を使用して実行され、数値演算子の結果はint型になります。いずれかのオペランドがintでない場合、最初に数値プロモーションによってint型に拡張されます。

したがって、短くするために、操作は、その中にint値があるという唯一の例外で、常にlongになります。

int = int + int
long = int + long
int = short + short

演算子の優先度が重要であることに注意してください。

long = int * int + long

int * int操作はintになり、操作中にlongにプロモートされますint + long

0
AxelH