floatデータ型は単精度の32ビットIEEE 754浮動小数点で、doubleデータ型は倍精度の64ビットIEEE 754浮動小数点です。
どういう意味ですか?また、いつdoubleの代わりにfloatを使用する必要がありますか?
double
ではなくfloat
、精度に関連するバグから救う場合は、価値があります。
floatデータ型は単精度の32ビットIEEE 754浮動小数点で、doubleデータ型は倍精度の64ビットIEEE 754浮動小数点です。
どういう意味ですか?また、いつdoubleの代わりにfloatを使用する必要がありますか?
double
ではなくfloat
、精度に関連するバグから救う場合は、価値があります。
回答:
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
、を使用して、任意の精度でそのような状況をエレガントに処理します。
*100
。ここにポイントがありますが、もっと正確に言えますか:)
実数とも呼ばれる浮動小数点数は、小数精度が必要な式を評価するときに使用されます。たとえば、平方根などの計算、または正弦や余弦などの超越関数は、浮動小数点型を必要とする精度の値になります。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変数宣言の例をいくつか示します。
フロート高温、低温;
ダブル
doubleキーワードで示される倍精度は、64ビットを使用して値を格納します。高速の数学的計算用に最適化されている一部の最新のプロセッサーでは、倍精度は実際には単精度よりも高速です。sin()、cos()、sqrt()などのすべての超越数学関数は、double値を返します。多くの反復計算で精度を維持する必要がある場合、または大きな値の数値を操作する場合は、doubleが最適です。
float
もdouble
型も最適ではありません。この記事では、さらに詳しく説明します:javapractices.com/topic/TopicAction.do
それにもかかわらず、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;
}
}
これはエラーになります:
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はより少ないスペースですが正確ではありません。
IEEE標準によれば、floatは実数の32ビット表現であり、doubleは64ビット表現です。
Javaプログラムでは、通常、ほとんどの場合、doubleデータ型の使用が見られます。doubleデータ型を使用して対応できる数値の範囲は、floatを使用した場合の範囲よりも大きいため、オーバーフローを回避するためだけです。
また、高精度が必要な場合は倍精度の使用をお勧めします。かなり以前に実装されたライブラリメソッドはまだ、floatデータ型を使用する必要があります(これは、floatを使用して実装されたためであり、他には何もありません!)。
ただし、プログラムで必要な数値が少なく、floatを使用してもオーバーフローが発生しないことが確実な場合、floatを使用すると、doubleで必要なメモリの半分が必要になるため、スペースの複雑さが大幅に改善されます。
この例は、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/
通常のプログラミング計算では、floatは使用しません。結果の範囲がfloatデータ型の範囲内にあることを確認したら、メモリを節約するためにfloatデータ型を選択できます。一般的に、2つの理由からdoubleを使用します:-
floatデータ型とdoubleデータ型はどちらも、近似誤差が許容される科学計算用に特別に設計されています。精度が最も重要な場合は、floatまたはdoubleデータ型の代わりにBigDecimalクラスを使用することをお勧めします。ソース:-JavaのFloatおよびDoubleデータ型