別の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
double
sもfloat
sにすることはできませんか?
前もって感謝します
はい。ただし、浮動小数点数であることを指定する必要があります。そうでない場合は、倍精度浮動小数点数として扱われます。
z.b = 2.2f
数値の末尾の「f」は、数値をdoubleではなくfloatにします。
Javaは自動的にdoubleをfloatに狭めません。
いいえ、floatは自動的にdoubleにアップキャストできますが、doubleの方が範囲が広いため、doubleは明示的なキャストなしにfloatになることはありません。
floatの範囲は1.40129846432481707e-45
から3.40282346638528860e+38
二重範囲は4.94065645841246544e-324d
から1.79769313486231570e+308d
デフォルトでは、Javaは10進数(たとえば、「4.3
」)をdouble
として扱います。ただし、数値の後にfを追加してfloat
を指定しない限り(例: 4.3f
」)。
両方の回線で同じ問題が発生しています。まず、10進リテラルはコンパイラーによってdoubleとして解釈されます。次に、タイプb
のfloat
に割り当てようとします。 double
は64ビットであり、float
は32ビットしかないため( Javaのプリミティブのドキュメント を参照)、Javaはエラーを示し、 float
がdouble
に収まらないことを解決します。解決策は、10進数リテラルにfを追加することです。
反対のことをしようとした場合(つまり、float
をdouble
に割り当てることができる)、float
の32ビットをdouble
の64ビット内に収めることができるため、問題ありません。 。
Floatは使用しないでください。それを使用する正当な理由はほとんどなく、10年以上使用されていません。ダブルを使用するだけです。
can't doubles be floats as well?
いいえ。各値または変数には、1つの型(double、float、int、longなど)があります。 Java言語仕様 は、あるタイプの値を別のタイプの変数に割り当てようとしたときに何が起こるかを正確に示しています。通常、「小さい」値の「大きい」タイプへの割り当ては許可され、暗黙的に行われますが、ターゲットタイプが「小さすぎ」てOriginタイプのすべての値を保持できないために情報が失われる可能性がある割り当ては、具象値がターゲットの型に適合しても、コンパイラー。
そのため、float変数にdouble値(リテラルは暗黙的に)を割り当てると情報が失われる可能性があるとコンパイラーが文句を言うので、値をfloatにするか、明示的にキャストすることにより、値を分割する必要があります。
技術的な理由により暗黙的にintに「拡大」されるため、混乱を招くことが多い領域の1つは計算です。したがって、2つのshortを乗算して、結果をshortに割り当てようとすると、計算の結果がintであるため、コンパイラーは文句を言います。
floatの範囲がdoubleよりも小さいため、floatをdoubleで簡単に表すことができますが、逆は不可能です。たとえば、floatの範囲外の値を取ると、慣例により正確なデータが失われるためです。