web-dev-qa-db-ja.com

2つの長い変数をjavaで分割する方法

基本的な質問で申し訳ありませんが、長い変数を別の長い変数で除算する必要がありますが、0を返します。

long a = 3004230;
long b =  6793368;
long c = (a/b)*100;
24
Arulmurugan

リテラル値とリテラル算術

そのコードにはいくつかの問題があります。まず、非浮動小数点リテラル値はデフォルトでint型であるため、コードの3004230intです。明示的にlongとして宣言するには、代わりに3004230Lを使用します。

また、非浮動小数点literalsで行われたすべての演算は、intfloatなどの浮動小数点型に特にキャストされない限り、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 */

これがお役に立てば幸いです。

29
Rudi Kershaw
final long a = 3004230;
final long b = 6793368;
final double c = ((double) a / b) * 100;

=> c = 44.22298335670907

3
Cengiz

明らかに答えは0上記のように。分割するとわかるように

3004230/6793368 = 0.442 = 0(long型にキャストされた場合)

そして

0 *任意の数= 0 ..

これを使用して変換するには

double c = (a * 1.0/b)*100.0;

decimalまたはfloat..doubleであるlong値を格納できるデータ型を使用する必要がある

2
rock321987

それを試してみてください。

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
2
whhotw

floatにキャストしなくても同じことができます。

long a =  3004230L;
long b =  6793368L;
long c = (a * 100L)/b;
1
vz0

作成している長いcは、期待した値ではありません。整数の範囲内です。ロングを作成するには、使用します

最終ロングc = 3004230L * 6793368L;数値リテラルの後にLを追加することにより、コンパイラーにintではなくlongとしてコンパイルするように指示します。

0
sona

あなたが今していることは整数除算です。これは常に整数/長い結果を返します。後で整数値にキャストバックしても、浮動小数点の結果を得るには、floatまたはdoubleを使用する必要があります。

long c = (long)(a/(float)b*100);
0
Dawnkeeper