基本的な質問で申し訳ありませんが、長い変数を別の長い変数で除算する必要がありますが、0を返します。
long a = 3004230;
long b = 6793368;
long c = (a/b)*100;
そのコードにはいくつかの問題があります。まず、非浮動小数点リテラル値はデフォルトでint
型であるため、コードの3004230
はint
です。明示的にlong
として宣言するには、代わりに3004230L
を使用します。
また、非浮動小数点literalsで行われたすべての演算は、int
やfloat
などの浮動小数点型に特にキャストされない限り、double
の結果を返します。そのため、(a/b)*100
は1未満であるため、 切り捨て が0になります(浮動小数点値は切り捨てられます)。また、同じ結果が返された場合でも、浮動小数点値を格納できないlong
に格納しようとしています。
したがって、実際の結果を得るには、次のようなことを行う必要があります。
long a = 3004230L; // Use the L notation to declare this literal a long.
long b = 6793368L;
double c = ((double)a/b)*100; /* casting your division result to (double) means
the result will not be 0 */
これがお役に立てば幸いです。
final long a = 3004230;
final long b = 6793368;
final double c = ((double) a / b) * 100;
=> c = 44.22298335670907
明らかに答えは0
上記のように。分割するとわかるように
3004230/6793368 = 0.442 = 0(
long
型にキャストされた場合)
そして
0 *任意の数= 0 ..
これを使用して変換するには
double c = (a * 1.0/b)*100.0;
decimal
またはfloat
..double
であるlong
値を格納できるデータ型を使用する必要がある
それを試してみてください。
long a = 3004230;
long b = 6793368;
long c = ((long)((float)a/(float)b)*100); //answer=44
float c = ((long)((float)a/(float)b)*100); //answer=44.1256378
float
にキャストしなくても同じことができます。
long a = 3004230L;
long b = 6793368L;
long c = (a * 100L)/b;
作成している長いcは、期待した値ではありません。整数の範囲内です。ロングを作成するには、使用します
最終ロングc = 3004230L * 6793368L;数値リテラルの後にLを追加することにより、コンパイラーにintではなくlongとしてコンパイルするように指示します。
あなたが今していることは整数除算です。これは常に整数/長い結果を返します。後で整数値にキャストバックしても、浮動小数点の結果を得るには、floatまたはdoubleを使用する必要があります。
long c = (long)(a/(float)b*100);