web-dev-qa-db-ja.com

Java:d​​oubleとfloat

別のBruce Eckel演習では、私が作成したコードはメソッドを受け取り、別のクラスの値を変更します。これが私のコードです:

class Big {
  float b;
}

public class PassObject {
  static void f(Letter y) {
    y.c = 'z';
  } //end f()
  static void g(Big z) {
    z.b = 2.2;
  }

  public static void main(String[] args ) {
    Big t = new Big();
    t.b = 5.6;
    System.out.println("1: t.b : " + t.b);
    g(x);
    System.out.println("2: t.b: " + t.b);
  } //end main
}//end class

「精度が失われる可能性があります」というエラーがスローされます。

PassObject.Java:13: possible loss of precision
found: double
required : float   z.b = 2.2
passobject.Java:20: possible loss of precision
found : double
required : float   t.b = 5.6

doublesもfloatsにすることはできませんか?

前もって感謝します

22
phill

はい。ただし、浮動小数点数であることを指定する必要があります。そうでない場合は、倍精度浮動小数点数として扱われます。

z.b = 2.2f

数値の末尾の「f」は、数値をdoubleではなくfloatにします。

Javaは自動的にdoubleをfloatに狭めません。

32
mipadi

いいえ、floatは自動的にdoubleにアップキャストできますが、doubleの方が範囲が広いため、doubleは明示的なキャストなしにfloatになることはありません。

floatの範囲は1.40129846432481707e-45から3.40282346638528860e+38

二重範囲は4.94065645841246544e-324dから1.79769313486231570e+308d

17
Powerlord

デフォルトでは、Javaは10進数(たとえば、「4.3」)をdoubleとして扱います。ただし、数値の後にfを追加してfloatを指定しない限り(例: 4.3f」)。

両方の回線で同じ問題が発生しています。まず、10進リテラルはコンパイラーによってdoubleとして解釈されます。次に、タイプbfloatに割り当てようとします。 doubleは64ビットであり、floatは32ビットしかないため( Javaのプリミティブのドキュメント を参照)、Javaはエラーを示し、 floatdoubleに収まらないことを解決します。解決策は、10進数リテラルにfを追加することです。

反対のことをしようとした場合(つまり、floatdoubleに割り当てることができる)、floatの32ビットをdoubleの64ビット内に収めることができるため、問題ありません。 。

9
mtlynch

Floatは使用しないでください。それを使用する正当な理由はほとんどなく、10年以上使用されていません。ダブルを使用するだけです。

6
Peter Lawrey
can't doubles be floats as well?

いいえ。各値または変数には、1つの型(double、float、int、longなど)があります。 Java言語仕様 は、あるタイプの値を別のタイプの変数に割り当てようとしたときに何が起こるかを正確に示しています。通常、「小さい」値の「大きい」タイプへの割り当ては許可され、暗黙的に行われますが、ターゲットタイプが「小さすぎ」てOriginタイプのすべての値を保持できないために情報が失われる可能性がある割り当ては、具象値がターゲットの型に適合しても、コンパイラー。

そのため、float変数にdouble値(リテラルは暗黙的に)を割り当てると情報が失われる可能性があるとコンパイラーが文句を言うので、値をfloatにするか、明示的にキャストすることにより、値を分割する必要があります。

技術的な理由により暗黙的にintに「拡大」されるため、混乱を招くことが多い領域の1つは計算です。したがって、2つのshortを乗算して、結果をshortに割り当てようとすると、計算の結果がintであるため、コンパイラーは文句を言います。

3

floatの範囲がdoubleよりも小さいため、floatをdoubleで簡単に表すことができますが、逆は不可能です。たとえば、floatの範囲外の値を取ると、慣例により正確なデータが失われるためです。

0
sumanta