web-dev-qa-db-ja.com

Javaにおけるfloat型とdouble型

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

どういう意味ですか?そして、いつdoubleを使うのではなくfloatを使うべきですか?

202
Leo

その上の Wikipedia page は始めるのに良い場所です。

総括する:

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

  • doubleは64ビットで表され、1符号ビット、11ビットの指数、および52ビットの仮数で表されます。

デフォルトでは、Javaは浮動小数点数を表すためにdoubleを使用します(したがって、リテラル3.14doubleと入力されます)。それはあなたにはるかに大きい数の範囲を与えるデータタイプでもあるので、私はfloat上でそれを使うことを強く勧めます。

実際にfloatの使用を強制する特定のライブラリがあるかもしれませんが、一般的に - あなたの結果がfloat規定の範囲 に収まるほど十分に小さいことが保証できない場合は、doubleを選択するのが最善です。

あなたが正確さを必要とするなら - 例えば、あなたは(1/10 + 2/10のように)不正確な10進値を持つことはできません、またはあなたは通貨で なんでも をしています(例えば、システムで10.33ドルを表す)、そしてBigDecimalを使用してください。これは任意の量の精度をサポートし、そのような状況をエレガントに処理できます。

235
Makoto

フロートはあなたに約を与えます。倍精度の場合は6-7桁の10進数精度。 15−16。数値の範囲もdoubleの方が大きくなります。

Doubleは8バイトの記憶領域を必要とし、floatは4バイトしか必要としません。

68
Henry

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


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


浮く

Float型は、32ビットの記憶領域を使用する単精度値を指定します。一部のプロセッサでは単精度の方が速く、倍精度の半分のスペースが必要ですが、値が非常に大きいか非常に小さい場合は不正確になります。 float型の変数は、小数部を必要とするが、それほど精度を要求しない場合に便利です。

以下はfloat変数の宣言例です。

float hightemp、lowtemp。


double

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

13
Ye Win

それでも、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;
    }
}
2
Raymond Wachaga

IEEE規格によると、floatは実数の32ビット表現であり、doubleは64ビット表現です。

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

高精度が要求される場合にもdoubleの使用が推奨されます。ずっと前に実装されたライブラリメソッドは、やはり必須としてfloatデータ型を使用する必要があります(これは、floatを使用して実装されたためだけです。

しかし、あなたのプログラムが少数を必要とし、あなたのfloatの使用でオーバーフローが起こらないことを確信しているなら、floatがdoubleによって要求されるように半分のメモリを必要とするので.

1
Rubal

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

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

/MyClass.Java:3:error:互換性のない型:doubleから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として格納します。

Doubleは、計算時により多くのスペースを取りますが、より正確になります。floatは、スペースを取りませんが精度は低下します。

0
Himanshu Singh

この例では、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));

倍精度(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://s-j.github.io/Java-float/ /

0
acohen