web-dev-qa-db-ja.com

Javaで2つの整数の除算が0.0を返すのはなぜですか?

int totalOptCount = 500;
int totalRespCount=1500; 
float percentage =(float)(totalOptCount/totalRespCount);

なぜこれは常に値0.0を返すのですか?また、これを00.00形式にフォーマットして文字列に変換したいですか?

48
kiran

除算が行われた後に浮動小数点への変換が発生するためです。必要なもの:

float percentage = ((float) totalOptCount) / totalRespCount;

次のような形式でフォーマットできるはずです。

String str = String.format("%2.02f", percentage);
93
unwind

intの値を使用している場合は、doubleを使用する方が適切な選択であり、丸め誤差が少なくなります。 floatint値を最大1600万までエラーなしで表すことができます。 doubleは、すべてのint値を正確に表すことができます。

double percentage =(double) totalOptCount / totalRespCount;

通常、パーセンテージは100倍されます。つまり、キャストをドロップできます。

double percentage = 100.0 * totalOptCount / totalRespCount;
12
Peter Lawrey

整数除算(long、short、byte、char、intを含む)Javaは常にint(またはパラメーターの1つが長い場合はlong)を返し、ゼロに丸めます。変換が行われます。この計算の後。

(書式設定の質問は、他の回答によって既に回答されています-あるいは、Java.text.NumberFormat、特にJava.text.DecimalFormatを見ることができます。)

3
Paŭlo Ebermann

(totalOptCount/totalRespCount)

ここでは、被除数と除数の両方がint型です。つまり、整数値のみが許可され、そのような方程式の答えは常に整数リテラルになります。

これを破ると、次のようになります

(double)(500/1500)

実際の計算によると、500/1500は0.33333を返しますが、両方のオペランドがint型であるため、コンパイラはこれを整数リテラルに変換します

(double)(0)


コンパイラーはこれをキャストする命令を受け取ります0値を2倍にして、0.0結果として

0.0

そして、@ Zach Janickiが提案するように、結果を任意の形式に変更できます。

両方のオペランドが同じ型の場合、結果も同じ型になることに注意してください

3
Dheeresh
String.format("%2.02f", (float)totalOptCount/totalRespCount);
1
Dalmas

doubleをフォーマットし、パーセンテージとして出力するには、次を使用できます。

System.out.println(new DecimalFormat("##.##").format(yourDouble) + "%"));
1
Zach Janicki