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