102

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

基本的に、完了した数量と合計の2つの数量を取得し、それらを分割して(完了した量の)パーセンテージを算出したいと思います。数量はlongsです。設定は次のとおりです。

long completed = 25000;
long total = 50000;

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

結果をdoubleに再割り当てしてみました-印刷され0.0ます。どこが間違っているのですか?

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

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

4

7 に答える 7

156

出力の変換は遅すぎます。計算はすでに整数演算で行われています。入力を次のように変換する必要がありますdouble

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

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

于 2011-08-28T11:35:27.420 に答える
12

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

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

于 2011-08-28T12:08:27.660 に答える
8
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

どちらかを型キャストするだけです。

于 2016-07-14T18:02:48.963 に答える
3

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

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

于 2011-08-28T11:36:34.550 に答える
1

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

試してみてください

float completed = 50000.0f;

そしてそれは大丈夫でしょう。

于 2011-08-28T11:36:38.760 に答える
1

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

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

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

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

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

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

long = int * int + long

int * int操作の結果は、操作中ににint昇格しますlongint + long

于 2017-05-09T08:46:59.750 に答える
-2

出力の結果がdoubleになるため、分割中に完了変数または合計変数、あるいはその両方をdoubleにキャストする必要があります。

したがって、正しい実装は次のようになります。

System.out.println((double)completed/total);
于 2017-08-20T04:44:41.033 に答える