23

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 もs ではないfloatでしょうか?

4

6 に答える 6

32

はい。ただし、float であることを指定する必要があります。そうしないと、double として扱われます。

z.b = 2.2f

数値の末尾にある 'f' は、倍精度ではなく浮動小数点数になります。

Java は double を float に自動的にナローしません。

于 2009-04-24T19:17:23.883 に答える
18

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

float の範囲1.40129846432481707e-453.40282346638528860e+38

ダブルレンジ4.94065645841246544e-324d1.79769313486231570e+308d

于 2009-04-24T19:16:11.437 に答える
9

デフォルトでは、数値の後に f を追加して a を指定しない限り(" " など)、Java は 10 進数 (" 4.3" など) を a として扱います。doublefloat4.3f

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

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

于 2009-04-24T19:31:26.220 に答える
6

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

于 2009-04-25T01:15:13.540 に答える
3
can't doubles be floats as well?

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

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

混乱の原因となることが多い領域の 1 つは計算です。これは、技術的な理由から暗黙的に int に「拡張」されるためです。そのため、2 つの short を乗算し、その結果を short に代入しようとすると、計算結果が int であるため、コンパイラはエラーを出します。

于 2009-04-24T19:37:35.007 に答える