華氏の温度を対応する摂氏に変換しようとしているので、次のように書きました。
double f = 90.0;
double c = (90.0-32)*(5/9); // 0.0
しかし、これは機能しません.2番目の括弧を使用しないと幸運です:
double c = (90.0-32)*5/9; // 32.2222
なぜこれが(少なくとも私にとっては)奇妙な振る舞いなのですか?
華氏の温度を対応する摂氏に変換しようとしているので、次のように書きました。
double f = 90.0;
double c = (90.0-32)*(5/9); // 0.0
しかし、これは機能しません.2番目の括弧を使用しないと幸運です:
double c = (90.0-32)*5/9; // 32.2222
なぜこれが(少なくとも私にとっては)奇妙な振る舞いなのですか?
Don't use integers in division since 2/5 = 0
but 2.0/5.0 = 0.4
あなたの問題はここにあります
double c = (90.0-32)*(5/9);
5と9を整数で除算すると、値はゼロになります。5または9のいずれかをdouble値に変更します。
double c = (90.0-32)*(5.0/9);
整数を除算すると、結果は整数になります。もちろん、整数は結果の真の小数値を格納できず、その整数部分のみを格納できます。
(90.0-32)*5/9
はとして評価されます((90.0-32)*5)/9
。除算はdoubleとintの間で行われることに注意してください(これは暗黙的にdoubleにキャストされます)。
(90.0-32)*(5/9)
そこには、5/9
ゼロであるがあります。
(5/9)は0を与えるので、(5.0 / 9.0)のようなことをします
2つ目:
double c = (90.0-32)*5/9;
かっこ内の式はfloatであるため、これを再度乗算して数値で除算すると、最終結果はfloatのままになります。
この方法で試してください.....
この例は、xとyが整数の場合、返される値は0であることを示していますが、xとyが2倍の場合、その0.5555555555555556
public class Test{
public static void main(String[] args){
double x = 5.0;
double y = 9.0;
System.out.println((90.0-32.0)*(x/y));
}
}
変数の初期化中に、次のことを試すことができます。
double f = 90D ;
float fl = 50F ;
.0
したがって、値を毎回処理する必要はありません。
異なるデータ型を使用する数値式では、指定されていない限り、デフォルトの選択肢は と にint
なりdouble
ます。
プリミティブ データ型の詳細を参照してください。
理由がない限り、通常はintデータ型がデフォルトで選択されます。
10 進数の値の場合、通常はdoubleデータ型がデフォルトで選択されます。
あなたの表現で:
double c = (90.0-32)*(5/9); // 0.0
5
および9
in 式(5/9)
はデータ型と見なされるint
ため、除算の結果は0
、 anint
です。(90.0-32)
の結果は にdouble
なり32
ますint
。
2.1double */+/- int/long/float/double
double
double divided_by_any int/long/float/double
double
上記の点を念頭に置いて、式 forは次のc
ように解釈できます。
double c = (double)*(int);
double c = (90.0-32)*(0);
double c = 0.0; // double
したがって、 の結果は にc
なりますdouble
0.0
。
表現
double c = (90.0-32)*5/9; // 32.2222
演算子の優先順位に基づいて、次のように解釈されます。
double c = ( (90.0-32)*5 ) / 9; // ( (double - int) * int ) / int
//c = ( (58.0)*5 ) / 9; // ( (double) * int ) / int
//c = ( 290.0 ) / 9; // ( double ) / int
c = 32.22222222222222; // double
5
あるいは、または9
を(5/9)
aに明示的にキャストすると、double
が得32.22222222222222
られc
ます。
//double c = (90.0-32)*(5/9);
double c = (90.0-32)*( (double)5/9 ); // (double - int) * ( (double)int / int )
// or
//double c = (90.0-32)*( 5/(double)9 ); // (double - int) * ( int / (double)int )
//c = (58.0)*(5.0/9); // ( (double) * ( double / int )
//c = (58.0)*(0.5555555555555556); // ( double )*( double )
c = 32.22222222222222; // double
明確な式とステートメントの詳細については、
式、ステートメント、およびブロックも参照してください。