Floatデータ型は単精度32ビットIEEE 754浮動小数点数で、doubleデータ型は倍精度64ビットIEEE 754浮動小数点数です。
どういう意味ですか?そして、いつdoubleを使うのではなくfloatを使うべきですか?
その上の Wikipedia page は始めるのに良い場所です。
総括する:
float
は32ビットで表され、1ビットの符号、8ビットの指数、および23ビットの仮数(または科学表記法の値から得られるもの:2.33728 * 10)12年; 33728は仮数です)。
double
は64ビットで表され、1符号ビット、11ビットの指数、および52ビットの仮数で表されます。
デフォルトでは、Javaは浮動小数点数を表すためにdouble
を使用します(したがって、リテラル3.14
はdouble
と入力されます)。それはあなたにはるかに大きい数の範囲を与えるデータタイプでもあるので、私はfloat
上でそれを使うことを強く勧めます。
実際にfloat
の使用を強制する特定のライブラリがあるかもしれませんが、一般的に - あなたの結果がfloat
の 規定の範囲 に収まるほど十分に小さいことが保証できない場合は、double
を選択するのが最善です。
あなたが正確さを必要とするなら - 例えば、あなたは(1/10 + 2/10
のように)不正確な10進値を持つことはできません、またはあなたは通貨で なんでも をしています(例えば、システムで10.33ドルを表す)、そしてBigDecimal
を使用してください。これは任意の量の精度をサポートし、そのような状況をエレガントに処理できます。
フロートはあなたに約を与えます。倍精度の場合は6-7桁の10進数精度。 15−16。数値の範囲もdoubleの方が大きくなります。
Doubleは8バイトの記憶領域を必要とし、floatは4バイトしか必要としません。
浮動小数点数は実数とも呼ばれ、小数精度を必要とする式を評価するときに使用されます。たとえば、平方根などの計算、またはサインやコサインなどの超越は、精度に浮動小数点型が必要な値になります。 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が最良の選択です。
それでも、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;
}
}
IEEE規格によると、floatは実数の32ビット表現であり、doubleは64ビット表現です。
Javaプログラムでは、通常、doubleデータ型を使用することがほとんどです。 doubleデータ型を使用して対応できる数値の範囲は、floatを使用した場合の範囲を超えるため、オーバーフローを回避するためだけのものです。
高精度が要求される場合にもdoubleの使用が推奨されます。ずっと前に実装されたライブラリメソッドは、やはり必須としてfloatデータ型を使用する必要があります(これは、floatを使用して実装されたためだけです。
しかし、あなたのプログラムが少数を必要とし、あなたのfloatの使用でオーバーフローが起こらないことを確信しているなら、floatがdoubleによって要求されるように半分のメモリを必要とするので.
これはエラーになります:
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は、スペースを取りませんが精度は低下します。
この例では、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/ /