JavaのFloatおよびDoubleデータ型


220

floatデータ型は単精度の32ビットIEEE 754浮動小数点で、doubleデータ型は倍精度の64ビットIEEE 754浮動小数点です。

どういう意味ですか?また、いつdoubleの代わりにfloatを使用する必要がありますか?


8
メモリ使用量が重要な場合は、doubleではなくfloatを使用する必要があります。より正確な計算が必要な場合は、doubleを使用します。
Everv0id 14

12
@ Everv0id:メモリが非常にタイトで、スペースの精度を犠牲にしなければならなかった状況はわかりません。(あなたは善のためにJavaを使用しています ...)それが必要とされるいくつかの状況があるかもしれませんが、私の実践では、それをめったに見たことはありません。これが良いアイデアだと思う理由を詳しく説明したい場合は、for-instanceを使用して回答を提供することをお勧めします。


5
@誠実際には、私は浮動小数点数を使用したことがなく、倍精度浮動小数点数のみを使用しています。しかし、(理論的には)大量の浮動小数点数を保持する必要のあるアプリケーションが存在する可能性があるため、2倍のメモリ使用量が重要になる可能性があります。理論的には、ofc; 実際には、いつでも別のサーバーを購入できます
Everv0id 14

3
私はメモリを節約するために4バイト、さらには2バイトの固定精度の数値を使用しましたが、これらの数が10億に達しない限り、価値があるとは思えません。「float」ではなく「double」(文字が1つ多い)を書くのにかかる時間は、使用する余分なメモリの1000倍の価値がありますが、使用するのdoubleではなくfloat、精度に関連するバグから救う場合は、価値があります。
Peter Lawrey、2014

回答:


259

Wikipediaのページ、その上には、開始するには良い場所です。

総括する:

  • floatは、32ビットで表され、1符号ビット、8ビットの指数、および23ビットの仮数(または科学表記法の番号から続くもの:2.33728 * 10 12 ; 33728は仮数)で表されます。

  • double 64ビットで表され、1つの符号ビット、11ビットの指数、52ビットの仮数があります。

デフォルトでは、Javaはdouble浮動小数点数を表すために使用します(そのため、リテラル3.14はtypedですdouble)。また、より大きな数値範囲を提供するのはデータ型でもあるので、を使用することを強くお勧めしますfloat

特定の実際の使用状況を強制するライブラリがあるかもしれませんfloatが、一般的に-あなたはあなたの結果がで収まるように小さな十分であることを保証することができない限りfloat所定の範囲を、それはと選ぶことがベストですdouble

正確さが必要な場合-たとえば、(のように1/10 + 2/10)不正確な10進値を使用できない、または通貨で何かを実行している(たとえば、システムで$ 10.33を表す)場合はBigDecimal、を使用して、任意の精度でそのような状況をエレガントに処理します。


4
233728 ==仮数ではありませんか?つまり、整数部分は他にどこに保存されていますか?
JaLoveAst1k 2016

1
@ mathguy54:科学表記では、2は整数の整数、.33728は仮数になります。 以下がそのリファレンスです。

5
私は浮動小数点数と倍精度数に関する情報を検索していて、これを見つけてコメントする必要がありました。小数セントを含まない通貨で何かをしている場合、BigDecimalの使用はばかげています。共通通貨は離散データであるため、整数データ型を使用する必要があります。(これは若いプログラマーが犯す最も一般的なエラーの1つです。ドルとセントを区切るために。を使用しているため、浮動小数点値であると考えられます。そうではありません。)
Trixie Wolf

2
@TrixieWolf、もっと具体的に言えば、2つの整数(整数部と小数部)を使用することを提案しましたか?そして、あなたは共通通貨について話している、残りはどうですか?一部の金額は小数点以下6桁で評価されるため、単純には計算できません*100。ここにポイントがありますが、もっと正確に言えますか:)
AxelH 2016年

9
@AxelH小数セントが存在する可能性がある財務計算の途中を除いて、お金は常に離散的です。1つの整数型を使用してデータを格納します。したがって、5.34ドルは534として格納されます。ドルの部分は整数演算のval / 100であり、セントは整数演算のval%100です。ここで、%は残りの演算を指します。小数点以下の桁数が多いお金の場合、離散的であるため、整数として保存する必要があります。ディスクリートではない場合でも、ほとんどの場合、ディスクリートストレージにバックオフする必要があります。これは、正確であるため、丸めエラーによる損失を防ぐためです。
Trixie Wolf

72

フロートはあなたに約を与えます。6桁から7桁の精度。15-16。また、数値の範囲はdoubleの方が大きくなります。

doubleには8バイトの記憶域が必要ですが、floatには4バイトしか必要ありません。


13

実数とも呼ばれる浮動小数点数は、小数精度が必要な式を評価するときに使用されます。たとえば、平方根などの計算、または正弦や余弦などの超越関数は、浮動小数点型を必要とする精度の値になります。Javaは、標準(IEEE–754)の浮動小数点型と演算子のセットを実装しています。浮動小数点型には、floatとdoubleの2種類があり、それぞれ単精度と倍精度の数値を表します。それらの幅と範囲は次のとおりです。


   Name     Width in Bits   Range 
    double  64              1 .7e308 to 1.7e+308
    float   32              3 .4e038 to 3.4e+038


浮く

float型は、32ビットのストレージを使用する単精度値を指定します。単精度は一部のプロセッサでは高速で、倍精度の半分のスペースを使用しますが、値が非常に大きいか非常に小さい場合は不正確になります。float型の変数は、小数コンポーネントが必要な場合に役立ちますが、それほどの精度は必要ありません。

次に、float変数宣言の例をいくつか示します。

フロート高温、低温;


ダブル

doubleキーワードで示される倍精度は、64ビットを使用して値を格納します。高速の数学的計算用に最適化されている一部の最新のプロセッサーでは、倍精度は実際には単精度よりも高速です。sin()、cos()、sqrt()などのすべての超越数学関数は、double値を返します。多くの反復計算で精度を維持する必要がある場合、または大きな値の数値を操作する場合は、doubleが最適です。


この回答は、floatとdoubleを使用する必要がある場合を明確にしました。なぜ使用しないのですか?
2014

8
丸めエラーの可能性を開くため、Javaの通貨には型floatdouble型も最適ではありません。この記事では、さらに詳しく説明します:javapractices.com/topic/TopicAction.do
Id=

1
「フロートは、ドルとセントを表すときに役立ちます。」-いいえ、いいえ、いいえ、nononono。決して、通貨をフロート/ダブルとして格納しないでください。
活動の削減

2

それにもかかわらず、Javaは計算にdoubleを使用する傾向があります。

今日私が先に書いたプログラムの例として、floatを使用するとメソッドが機能しませんでしたが、(NetBeans IDEで)floatをdoubleに置き換えると、うまく機能します。

package palettedos;
import java.util.*;

class Palettedos{
    private static Scanner Z = new Scanner(System.in);
    public static final double pi = 3.142;

    public static void main(String[]args){
        Palettedos A = new Palettedos();
        System.out.println("Enter the base and height of the triangle respectively");
        int base = Z.nextInt();
        int height = Z.nextInt();
        System.out.println("Enter the radius of the circle");
        int radius = Z.nextInt();
        System.out.println("Enter the length of the square");
        long length = Z.nextInt();
        double tArea = A.calculateArea(base, height);
        double cArea = A.calculateArea(radius);
        long sqArea = A.calculateArea(length);
        System.out.println("The area of the triangle is\t" + tArea);
        System.out.println("The area of the circle is\t" + cArea);
        System.out.println("The area of the square is\t" + sqArea);
    }

    double calculateArea(int base, int height){
        double triArea = 0.5*base*height;
        return triArea;
    }

    double calculateArea(int radius){
        double circArea = pi*radius*radius;
        return circArea;
    }

    long calculateArea(long length){
        long squaArea = length*length;
        return squaArea;
    }
}

今日も同じ問題がありました。このバイアスの背後にある理由は何ですか?
Shachi

2

これはエラーになります:

public class MyClass {
    public static void main(String args[]) {
        float a = 0.5;
    }
}

/MyClass.java:3:エラー:互換性のないタイプ:doubleからfloatへの非可逆変換の可能性float a = 0.5;

これは完全にうまくいきます

public class MyClass {
    public static void main(String args[]) {
        double a = 0.5;
    }
}

これも完璧に機能します

public class MyClass {
    public static void main(String args[]) {
        float a = (float)0.5;
    }
}

理由:Javaはデフォルトで実数を倍精度で格納して、精度を高めています。

Doubleはより多くのスペースを必要としますが、計算中の精度はより高く、floatはより少ないスペースですが正確ではありません。


1

IEEE標準によれば、floatは実数の32ビット表現であり、doubleは64ビット表現です。

Javaプログラムでは、通常、ほとんどの場合、doubleデータ型の使用が見られます。doubleデータ型を使用して対応できる数値の範囲は、floatを使用した場合の範囲よりも大きいため、オーバーフローを回避するためだけです。

また、高精度が必要な場合は倍精度の使用をお勧めします。かなり以前に実装されたライブラリメソッドはまだ、floatデータ型を使用する必要があります(これは、floatを使用して実装されたためであり、他には何もありません!)。

ただし、プログラムで必要な数値が少なく、floatを使用してもオーバーフローが発生しないことが確実な場合、floatを使用すると、doubleで必要なメモリの半分が必要になるため、スペースの複雑さが大幅に改善されます。


0

この例は、Javaのfloatから符号(左端のビット)、指数(後続の8ビット)、および仮数(右端の23ビット)を抽出する方法を示しています。

int bits = Float.floatToIntBits(-0.005f);
int sign = bits >>> 31;
int exp = (bits >>> 23 & ((1 << 8) - 1)) - ((1 << 7) - 1);
int mantissa = bits & ((1 << 23) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Float.intBitsToFloat((sign << 31) | (exp + ((1 << 7) - 1)) << 23 | mantissa));

同じ手法をdoubleにも使用できます(11ビットの指数と52ビットの仮数)。

long bits = Double.doubleToLongBits(-0.005);
long sign = bits >>> 63;
long exp = (bits >>> 52 & ((1 << 11) - 1)) - ((1 << 10) - 1);
long mantissa = bits & ((1L << 52) - 1);
System.out.println(sign + " " + exp + " " + mantissa + " " +
  Double.longBitsToDouble((sign << 63) | (exp + ((1 << 10) - 1)) << 52 | mantissa));

クレジット:http : //sj.github.io/java-float/


0

正確な計算を行うには、floatではなくdoubleを使用し、精度の低い計算を使用する場合は、doubleではなくfloatを使用する必要があります。Floatには10進数のみが含まれますが、doubleにはIEEE754倍精度浮動小数点数が含まれるため、数値をより正確に格納および計算することが容易になります。お役に立てれば。


0

通常のプログラミング計算では、floatは使用しません。結果の範囲がfloatデータ型の範囲内にあることを確認したら、メモリを節約するためにfloatデータ型を選択できます。一般的に、2つの理由からdoubleを使用します:-

  • 浮動小数点数をfloatデータ型として使用する場合、デフォルトではすべての浮動小数点数がdoubleとして扱われるため、メソッドの呼び出し元は明示的に接尾辞Fまたはfを付ける必要があります。プログラマーの負担を増やします。浮動小数点数をdoubleデータ型として使用する場合、接尾辞を追加する必要はありません。
  • Floatは単精度データ型であり、4バイトを占有します。したがって、大規模な計算では、完全な結果は得られません。doubleデータ型を選択すると、8バイトを占有し、完全な結果が得られます。

floatデータ型とdoubleデータ型はどちらも、近似誤差が許容される科学計算用に特別に設計されています。精度が最も重要な場合は、floatまたはdoubleデータ型の代わりにBigDecimalクラスを使用することをお勧めします。ソース:-JavaのFloatおよびDoubleデータ型

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.