21

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

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

問題は、なぜ(ca. の代わりに)resが等しいのかということです。に格納されているので、丸めはありませんよね?0.00.131944double

4

7 に答える 7

31

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

于 2012-09-07T09:03:17.850 に答える
20

longaを anで割っているのでintlong結果が得られます。あなたが効果的に行っていることは、

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

そのまま、キャストする場合millis/consta0double0.0

double を int で割って double の結果を得るには、次のようにします。

double res = (double) millis/consta;

これはと同じです

double res = ((double) millis)/((double) consta));
于 2012-09-07T08:59:35.880 に答える
4

あなたはlong除算を行っているので(intはlongにキャストされます)long、整数(つまり、0)である値を取得します

やったほうがいい

  double res = (double) millis / consta;

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

于 2012-09-07T09:00:07.440 に答える
1

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

割り当てる前にダブルにキャストしたい

于 2012-09-07T09:01:25.450 に答える
1

millis/constaは整数除算であり、結果は になり0ます。行のキャスティング:

double res = millis/consta;

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

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

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

double res = (double)millis/consta;
于 2012-09-07T08:59:45.427 に答える
0

これが発生すると、自動的に int にダウンキャストして操作を実行します。あなたはそれを次のように書いています:

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

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

于 2012-09-07T09:00:38.703 に答える
0

これは、 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
于 2012-09-07T09:11:08.073 に答える