2

華氏の温度を対応する摂氏に変換しようとしているので、次のように書きました。

double f = 90.0;
double c = (90.0-32)*(5/9); // 0.0

しかし、これは機能しません.2番目の括弧を使用しないと幸運です:

double c = (90.0-32)*5/9; // 32.2222

なぜこれが(少なくとも私にとっては)奇妙な振る舞いなのですか?

4

7 に答える 7

3

Don't use integers in division since 2/5 = 0 but 2.0/5.0 = 0.4

于 2012-07-15T11:17:01.733 に答える
2

あなたの問題はここにあります

double c = (90.0-32)*(5/9);

5と9を整数で除算すると、値はゼロになります。5または9のいずれかをdouble値に変更します。

double c = (90.0-32)*(5.0/9);

整数を除算すると、結果は整数になります。もちろん、整数は結果の真の小数値を格納できず、その整数部分のみを格納できます。

于 2012-07-15T11:18:10.643 に答える
2

(90.0-32)*5/9はとして評価されます((90.0-32)*5)/9。除算はdoubleとintの間で行われることに注意してください(これは暗黙的にdoubleにキャストされます)。

(90.0-32)*(5/9)そこには、5/9ゼロであるがあります。

于 2012-07-15T11:20:21.297 に答える
2

(5/9)は0を与えるので、(5.0 / 9.0)のようなことをします

2つ目:

double c = (90.0-32)*5/9;

かっこ内の式はfloatであるため、これを再度乗算して数値で除算すると、最終結果はfloatのままになります。

于 2012-07-15T11:20:46.487 に答える
2

この方法で試してください.....

この例は、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));
    }

}
于 2012-07-15T11:21:02.943 に答える
2

変数の初期化中に、次のことを試すことができます。

double f = 90D ;
float fl = 50F ;

.0したがって、値を毎回処理する必要はありません。

于 2012-07-15T11:23:43.913 に答える
1

異なるデータ型を使用する数値式では、指定されていない限り、デフォルトの選択肢は と にintなりdoubleます。

プリミティブ データ型の詳細を参照してください。

  1. 理由がない限り、通常はintデータ型がデフォルトで選択されます。

  2. 10 進数の値の場合、通常はdoubleデータ型がデフォルトで選択されます。

あなたの表現で:

double c = (90.0-32)*(5/9); // 0.0
  1. 5および9in 式(5/9)はデータ型と見なされるintため、除算の結果は0、 anintです。
  2. は であるため、式(90.0-32)の結果は にdoubleなり32ますint。 2.1
    はご存知かもしれません。結果は になります。 2.2. 結果は になります。
    double */+/- int/long/float/doubledouble
    double divided_by_any int/long/float/doubledouble

上記の点を念頭に置いて、式 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

明確な式とステートメントの詳細については、
式、ステートメント、およびブロックも参照してください。

于 2012-07-15T13:47:02.630 に答える