私はこのような値を持っています:
long millis = 11400000;
int consta = 86400000;
double res = millis/consta;
問題は、なぜres
が0.0
に等しいのか(約0.131944
ではなく)?これはdouble
に格納されているため、丸めを行う必要はありませんか?
2項演算子を使用している場合、両方の引数は同じ型である必要があり、結果もその型になります。 (int)/(long)
を除算すると、(long)/(long)
になり、結果は(long)
になります。二重の結果を得るには、(double)/(long)
または(int)/(double)
にする必要があります。 doubleはintおよびlongよりも大きいため、(double)/(long)
および(int)/(double)
ではintおよびlongがdoubleに変換されます。
long
をint
で除算しているため、long
の結果が得られます。あなたが効果的にやっているのは
double res = (double) (millis/consta);
なので millis/consta
は0
、double
へのキャスト時は0.0
以下を試して、doubleをintで除算し、doubleの結果を取得します。
double res = (double) millis/consta;
それは同じです
double res = ((double) millis)/((double) consta));
long
division(intはlongにキャストされます)を実行しているので、整数であるlong
値を取得します(so、0)
やったほうがいい
double res = (double) millis / consta;
値の1つがdoubleにキャストされると、他の値もキャストされるため、両方の演算子で同じ型が使用されます。
millis/consta
は整数除算であり、結果は0
。行のキャスト:
double res = millis/consta;
結果に対して行われます:
double res = (double)(millis/consta);
必要なことは、オペランドの1つをキャストすることです。
double res = (double)millis/consta;
結果のlongおよびint除算の型はlongになり、小数を保持できません。
割り当てる前にdoubleにキャストしたい
これが発生すると、操作を実行するために自動的にintにダウンキャストされます。次のように書いてください。
long millis = 11400000;
int consta = 86400000;
double res = ((double)millis)/((double)consta);
そしてそれはうまくいきます。
これは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