5

誰かが私にこれの出力の理由を説明できますか?

    double y = 15/7;
    DecimalFormat first = new DecimalFormat("#.###");
    System.out.println(y); 
    String format_string = first.format(y);
    System.out.println(format_string);

これは:

   2.0
   2

(どちらが間違っているか)

ただし、15/7をに変更すると

 15.0/7.0

それは私に正しい答えを与えます

 2.142857142857143
 2.143

説明してください?

ありがとうございました!

4

6 に答える 6

3

交換

double y = 15/7;

double y = 15.0/7;

2つに分割するintと、が得られますint

仕様を参照してください:

整数の除算は0に丸められます。つまり、2進数値昇格(§5.6.2)の後に整数であるオペランドnおよびdに対して生成される商は、| d・q|を満たしながら大きさが可能な限り大きい整数値qです。≤|n|。さらに、|n|のときqは正です。≥|d| nとdの符号は同じですが、|n|の場合qは負になります ≥|d| nとdの符号は反対です。

double変数に格納することで変換しdoubleますが、手遅れです。失われた精度を取り戻すことはできません。解決策は、オペランドの1つをdoubleにして、除算時にdoubleを取得することです。

于 2013-01-20T20:56:18.750 に答える
3

ドットのない数値は整数であるため、15/7は整数演算であり、結果は2(余りのない除算)になります。その後、doubleに変換されますが、値2(操作終了後の変換)をキープします。

ドットの付いた数値はそもそも2倍なので、15.0 / 7.0は2回の演算であり、目的の結果(浮動小数点除算)につながります。

于 2013-01-20T20:56:59.750 に答える
3

2を除算すると、integers常に結果が得られます。これが、 (フォーマット後に)integer取得する理由です。22.0

少なくとも1つの分割doubleはあなたに与えますdouble

あなたの場合15/7は2つの整数の除算であり、結果は整数です(誤った結果)。15/7.0またはに変更した場合、15.0/7または15.0/7.0結果はdouble正しい結果)になります

于 2013-01-20T20:57:07.537 に答える
1

15/7は整数除算を実行します。これは、最も近い整数に切り捨てられます。

15/7 = 2+1/7->2に丸められます

yをdoubleとして定義したかどうかは関係ありません。2つの整数リテラルを使用していたため、除算ではそれが考慮されませんでした。

于 2013-01-20T20:57:09.573 に答える
1

これは、除算演算の整数部分を返しているため15 / 7です。2float values操作が必要な場合は、次のようにします15f / 7

于 2013-01-20T20:57:20.060 に答える
1

両方の値は整数であるため、7に切り捨てられます。整数除算の結果は整数であるため、これらの除算の結果は10進数を処理できるdouble / floatであるため、double/floatを必ず除算する必要があります。数字の一部

除算の結果を実際に入力するものに整数にするためにdoubleを指定した場合でも、doubleを除算すると、結果がdoubleになるため、答えには正しい結果が含まれます。

于 2013-01-20T20:57:50.637 に答える