これは基本的な質問ですが、答えが見つかりません。私は浮動小数点演算と他のいくつかのトピックを調べましたが、これに対処するものは何もありませんでした。間違った用語を持っているに違いない。
基本的に、2つの数量(完了済みと合計)を取得し、それらを分割して(完了した量の)割合を求めます。数量はlong
sです。セットアップは次のとおりです。
long completed = 25000;
long total = 50000;
System.out.println(completed/total); // Prints 0
結果をdoubleに再割り当てしようとしました-0.0
を出力します。どこがおかしいの?
ちなみに、次のステップはこの結果に100を掛けることです。この小さなハードルが乗り越えられたら、これは簡単だと思います。
ところで、ここでの宿題ではなく、単なる昔ながらのnumskull-ness(そしておそらく今日のコーディングが多すぎる)。
outputの変換は遅すぎます。計算は既に整数演算で行われています。 inputsをdouble
に変換する必要があります。
System.out.println((double)completed/(double)total);
実際に入力のbothを変換する必要はないことに注意してください。それらの1つがdouble
である限り、もう1つは暗黙的に変換されます。しかし、私は対称性のために両方を行うことを好みます。
これにはダブルスも必要ありません。 100 firstを掛けてから割ります。そうしないと、結果は1未満になり、見たとおりゼロに切り捨てられます。
編集:またはオーバーフローが発生する可能性がある場合、オーバーフローする場合(つまり、配当が922337203685477581を超える場合)、最初に除数を100で除算します。
completed
とtotal
の両方をdouble
に変換するか、少なくとも分割を行うときにそれらをdouble
にキャストします。つまり結果だけでなく、変数を2倍にキャストします。
公正な警告です。float
およびdouble
を使用する場合、 浮動小数点精度の問題 があります。
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つの値のいずれかを明示的にfloatにキャストしない場合、整数除算が使用されます(そのため、0が返されます)。通常の除算が使用されるように、2つのオペランドの1つが浮動小数点値である必要があります(他の整数値は自動的にfloatに変換されます)。
試してみてください
float completed = 50000.0f;
そしてそれは大丈夫です。
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