2009-04-24 12 views
21

別のBruce Eckelの練習では、私が書いたコードはメソッドを取り、別のクラスの値を変更します。ここに私のコードです:Java:d​​ouble対float

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は同様にすることはできませんか?事前

答えて

29

ですが、そうでない場合は、double型として扱われ、彼らは浮動小数点数であることを指定する必要があります。

z.b = 2.2f 

番号の最後にある 'f'は、二重ではなく浮動小数点になります。

Javaは自動的に倍精度浮動小数点型をfloatに限定しません。あなたはそれ以外の場合は番号(例えば「4.3f 『)の後にFを追加することにより、floatを指定しない限り

+0

"f"を追加して固定しました。ありがとう! – phill

17

おかげいいえ、山車が自動的にアップキャスト倍になることができますが、ダブルスは、より大きな範囲を持っているので、ダブルスでは、明示的なキャストなしの山車になることはありません。

フロート範囲が1.40129846432481707e-45

3.40282346638528860e+38二重範囲であるはい 4.94065645841246544e-324d 1.79769313486231570e+308d

+9

'浮動小数点は倍にすることができますが、倍精度浮動小数点は浮動小数点にすることはできません。 これは間違っています。ダブルスは浮動小数点の範囲内にあれば浮動小数点になります。 –

+0

'' float'に '4.1'のように保存したいのであれば、' 3.4xxx'の範囲を渡さないのでできません。 '999.99'を明示的に格納することができるので、なぜ上限が' 3.xxx'から始まるのか理解できないようです。私は小数点の前に使うことができる少ない小数点を追加すると思いますか?それで '3.XX'はなぜ最大で' 0.XX'であってはなりませんか? – SSpoke

+0

@SSpoke(私はこのコメントを知らされていないので、今私はただそれに応答しています)これらの範囲は科学的表記です...浮動小数点の上限については、およそ340,282,346,638,528,860,000,000,000,000,000,000,000.0です。 – Powerlord

9

はデフォルトでは、Javaはdoubleとして(例えば』 4.3」)小数点以下を扱います。

両方の行で同じ問題が発生しています。まず、10進リテラルはコンパイラによってdoubleとして解釈されます。次にbに割り当てようとします。floatです。 doubleは64ビットで、floatは32ビット(Java's primitives documentation参照)なので、floatdoubleに収まらないことを示すエラーが表示されます。解決策は小数点のリテラルにfを追加することです。

あなたはsの64

3
can't doubles be floats as well? 

double内の32ビット」floatに合うことができるので、それは大丈夫だろう(つまりはfloatdoubleに割り当てる)反対をしようとしていた場合いいえ、それぞれの値または変数には、ちょうど1つの型(double、float、int、longなど)があります。 Java Language Specificationは、あるタイプの値を別のタイプの変数に代入しようとすると、まさに何が起こるかを述べています。一般に、「より小さい」値を「より大きい」タイプに割り当てることは暗黙的に許可され、行われるが、ターゲットタイプがすべて「あまりにも小さい」ために情報が失われる可能性のある割り当ては、たとえ具体的な値がターゲットの型に適合していても、コンパイラはコンパイラをコンパイルします。

これは、浮動小数点変数に二重の値(暗黙的にはリテラルである)を割り当てると情報が失われ、値を浮動小数点にするか、明示的にキャストしなければならないとコンパイラが訴えるのです。

混乱の原因となる領域は、技術的な理由から暗黙的にintに「広げられる」ため、計算です。したがって、2つのshortを乗算して結果をshortに代入しようとすると、計算結果がintであるためコンパイラは不平を言います。

6

floatは使用しないでください。それを使用する正当な理由はほとんどありませんし、10年以上も続いていません。ただ二重を使用してください。

+1

あなたはJavaを使ってOpenGL関連の開発をしたことがないと思います...:P – User

+1

@Maniusこれは私がこれを書いてから私が過去8年間行ったことですが、より強力なGPUはfloatまたはdouble私が取り組んだユースケースのために。主な問題は、データをGPUに十分速く送り込んでいることでした。 –

+1

合意。ちょうどちょっと(ああ、それは私が今見ているOLDの答えです)を選ぶだけです。 :)浮動小数点数を今のところ完全にダンプすることができれば本当にいいですが... – User

0

floatの範囲がdoubleよりも小さいので、floatをdoubleで簡単に表すことができますが、逆のことはできません。つまり、コンベンション中にfloatの範囲外にある値を取ると仮定します。