web-dev-qa-db-ja.com

long / int除算での予期しない結果

私はこのような値を持っています:

long millis = 11400000;
int consta = 86400000;
double res = millis/consta;

問題は、なぜres0.0に等しいのか(約0.131944ではなく)?これはdoubleに格納されているため、丸めを行う必要はありませんか?

17
alex

2項演算子を使用している場合、両方の引数は同じ型である必要があり、結果もその型になります。 (int)/(long)を除算すると、(long)/(long)になり、結果は(long)になります。二重の結果を得るには、(double)/(long)または(int)/(double)にする必要があります。 doubleはintおよびlongよりも大きいため、(double)/(long)および(int)/(double)ではintおよびlongがdoubleに変換されます。

27
Kamran Amini

longintで除算しているため、longの結果が得られます。あなたが効果的にやっているのは

double res = (double) (millis/consta);

なので millis/consta0doubleへのキャスト時は0.0

以下を試して、doubleをintで除算し、doubleの結果を取得します。

double res = (double) millis/consta;

それは同じです

double res = ((double) millis)/((double) consta));
19
Peter Lawrey

longdivision(intはlongにキャストされます)を実行しているので、整数であるlong値を取得します(so、0)

やったほうがいい

  double res = (double) millis / consta;

値の1つがdoubleにキャストされると、他の値もキャストされるため、両方の演算子で同じ型が使用されます。

3
SJuan76

millis/constaは整数除算であり、結果は0。行のキャスト:

double res = millis/consta;

結果に対して行われます:

double res = (double)(millis/consta);

必要なことは、オペランドの1つをキャストすることです。

double res = (double)millis/consta;
1
MByD

結果のlongおよびint除算の型はlongになり、小数を保持できません。

割り当てる前にdoubleにキャストしたい

1
Minion91

これが発生すると、操作を実行するために自動的にintにダウンキャストされます。次のように書いてください。

long millis = 11400000;
int consta = 86400000;
double res = ((double)millis)/((double)consta);

そしてそれはうまくいきます。

0
bjedrzejewski

これはlongのためです:longデータ型は64ビットの符号付き2の補数の整数です。 int:intデータ型は、32ビットの符号付き2の補数の整数です

プリミティブ型を参照 両方が整数であることを意味します。 longを整数で除算するため、結果はlong 0になります。ただし、この値をres(double)値に割り当てて出力します。したがって、結果0.0が表示されます。

long millis = 11400000;
int consta = 86400000;

System.out.println("millis/consta = " + millis/consta); // print 0

double res = millis/consta;
System.out.println("Res " + res); // print 0.0
0
swemon