float
日本語 | 単精度浮動小数点型 |
英語 | floating point |
ふりがな | ふろーと |
フリガナ | フロート |
プリミティブ型のひとつ。
実数値を格納するための型。
ラッパークラスはFloatクラス。
「1.5」のような、小数点を含む数を格納するための型。
32ビット(4バイト)の情報量を持ち、浮動小数点形式で実数を格納する。
32ビットの内訳は以下の通り(左端のビットを「0ビット目」とする)。
・0ビット目:符号
・1ビット目~8ビット目:指数部
・9ビット目~31ビット目:仮数部
それぞれの意味については「浮動小数点」「指数部」「仮数部」の項目を参照。
float型に浮動小数点リテラルの値を格納する際に、そのまま代入しようとするとコンパイルエラーになる。
これは、浮動小数点リテラルはdouble型だからである。
浮動小数点リテラルをfloat型にするには、末尾に「F」もしくは「f」を付ける。詳しくは「F」の項目を参照。
正の最大値は「3.4028235*10の38乗」、正の最小値は「1.4*10の-45乗」となる。ただしこれらは、指数部、仮数部それぞれの「表現できる最大の値・最小の値」である。
また、これらは共に「正の~」であり、0ビット目の符号を1にすれば、どちらもマイナスの値となる。
浮動小数点の性質上、値によっては誤差が生まれる。
金額の計算等、正確な実数値が必要な場合にはBigDecimalクラスの使用を勧める。
実数値を格納するための型。
ラッパークラスはFloatクラス。
「1.5」のような、小数点を含む数を格納するための型。
32ビット(4バイト)の情報量を持ち、浮動小数点形式で実数を格納する。
32ビットの内訳は以下の通り(左端のビットを「0ビット目」とする)。
・0ビット目:符号
・1ビット目~8ビット目:指数部
・9ビット目~31ビット目:仮数部
それぞれの意味については「浮動小数点」「指数部」「仮数部」の項目を参照。
float型に浮動小数点リテラルの値を格納する際に、そのまま代入しようとするとコンパイルエラーになる。
これは、浮動小数点リテラルはdouble型だからである。
浮動小数点リテラルをfloat型にするには、末尾に「F」もしくは「f」を付ける。詳しくは「F」の項目を参照。
正の最大値は「3.4028235*10の38乗」、正の最小値は「1.4*10の-45乗」となる。ただしこれらは、指数部、仮数部それぞれの「表現できる最大の値・最小の値」である。
また、これらは共に「正の~」であり、0ビット目の符号を1にすれば、どちらもマイナスの値となる。
浮動小数点の性質上、値によっては誤差が生まれる。
金額の計算等、正確な実数値が必要な場合にはBigDecimalクラスの使用を勧める。
参考サイト
// Sample.java
import java.text.DecimalFormat;
public class Sample
{
public static void main( String[] args )
{
// float型の変数宣言します。実数値「2.5」を格納します。
float f;
// メモリ上に32ビットの領域が確保されました。
// この変数に実数値2.5を格納します。
// 浮動小数点リテラルはそのままだとdouble型になるので、
// float型にするため末尾に「F」を付けます。
f = 2.5F;
// それを出力します。
System.out.println( f );
// 2.5
// float型変数に格納された「2.5」がどのように
// ビットとして格納されているか見てみます。
outputFloatBit( f );
// 0 10000000 01000000000000000000000
// ↑ ↑ ↑
// 符号 指数部 仮数部
// 詳しくは「浮動小数点」「指数部」「仮数部」の項目を
// ご覧ください。
// 正の最大値と正の最小値はFloatクラスのstaticフィールド
// として宣言されているのでそれを使いましょう。
f = Float.MAX_VALUE;
System.out.println( f );
DecimalFormat decimalFormat = new DecimalFormat( "0.0" );
System.out.println( decimalFormat.format( f ) );
outputFloatBit( f );
// 3.4028235E38
// 340282346638528860000000000000000000000.0
// 0 11111110 11111111111111111111111
f = Float.MIN_VALUE;
System.out.println( f );
decimalFormat = new DecimalFormat( "0.0000000000000000000000000000000000000000000000000000000000000" );
System.out.println( decimalFormat.format( f ) );
outputFloatBit( f );
// 1.4E-45
// 0.0000000000000000000000000000000000000000000014012984643248170
// 0 00000000 00000000000000000000001
// ただし、ビットを見れば分かりますがどちらも「指数部と仮数部、
// それぞれ取りうる値」としての最大値と最小値です。正負は最初の
// ビットだけで決まるので、マイナスにすれば「負の~」となります。
// float型は浮動小数点なので、誤差には気を付けてください。
float f1 = 4.1F;
float f2 = 8.2F;
System.out.println( f1 + f2 );
// 12.299999999999999
// このように、簡単に誤差が生じます。
// 正確な値が必要な場合にはBigDecimalクラスを使用しましょう。
}
/**
* float型変数をビット形式で出力します。
*/
private static void outputFloatBit( float f )
{
// float型変数をビット形式で文字列化します。
String source = Integer.toBinaryString( Float.floatToIntBits( f ) );
// 左0埋めします。
StringBuffer strbuf = new StringBuffer();
for( int iF1 = source.length(); iF1 < 32; ++iF1 )
{
strbuf.append( "0" );
}
strbuf.append( source );
// 符号、仮数部、指数部の間にスペースを入れます。
strbuf.insert( 9, " " );
strbuf.insert( 1, " " );
System.out.println( strbuf.toString() );
}
}
import java.text.DecimalFormat;
public class Sample
{
public static void main( String[] args )
{
// float型の変数宣言します。実数値「2.5」を格納します。
float f;
// メモリ上に32ビットの領域が確保されました。
// この変数に実数値2.5を格納します。
// 浮動小数点リテラルはそのままだとdouble型になるので、
// float型にするため末尾に「F」を付けます。
f = 2.5F;
// それを出力します。
System.out.println( f );
// 2.5
// float型変数に格納された「2.5」がどのように
// ビットとして格納されているか見てみます。
outputFloatBit( f );
// 0 10000000 01000000000000000000000
// ↑ ↑ ↑
// 符号 指数部 仮数部
// 詳しくは「浮動小数点」「指数部」「仮数部」の項目を
// ご覧ください。
// 正の最大値と正の最小値はFloatクラスのstaticフィールド
// として宣言されているのでそれを使いましょう。
f = Float.MAX_VALUE;
System.out.println( f );
DecimalFormat decimalFormat = new DecimalFormat( "0.0" );
System.out.println( decimalFormat.format( f ) );
outputFloatBit( f );
// 3.4028235E38
// 340282346638528860000000000000000000000.0
// 0 11111110 11111111111111111111111
f = Float.MIN_VALUE;
System.out.println( f );
decimalFormat = new DecimalFormat( "0.0000000000000000000000000000000000000000000000000000000000000" );
System.out.println( decimalFormat.format( f ) );
outputFloatBit( f );
// 1.4E-45
// 0.0000000000000000000000000000000000000000000014012984643248170
// 0 00000000 00000000000000000000001
// ただし、ビットを見れば分かりますがどちらも「指数部と仮数部、
// それぞれ取りうる値」としての最大値と最小値です。正負は最初の
// ビットだけで決まるので、マイナスにすれば「負の~」となります。
// float型は浮動小数点なので、誤差には気を付けてください。
float f1 = 4.1F;
float f2 = 8.2F;
System.out.println( f1 + f2 );
// 12.299999999999999
// このように、簡単に誤差が生じます。
// 正確な値が必要な場合にはBigDecimalクラスを使用しましょう。
}
/**
* float型変数をビット形式で出力します。
*/
private static void outputFloatBit( float f )
{
// float型変数をビット形式で文字列化します。
String source = Integer.toBinaryString( Float.floatToIntBits( f ) );
// 左0埋めします。
StringBuffer strbuf = new StringBuffer();
for( int iF1 = source.length(); iF1 < 32; ++iF1 )
{
strbuf.append( "0" );
}
strbuf.append( source );
// 符号、仮数部、指数部の間にスペースを入れます。
strbuf.insert( 9, " " );
strbuf.insert( 1, " " );
System.out.println( strbuf.toString() );
}
}
// Sample.java import java.text.DecimalFormat; public class Sample { public static void main( String[] args ) { // float型の変数宣言します。実数値「2.5」を格納します。 float f; // メモリ上に32ビットの領域が確保されました。 // この変数に実数値2.5を格納します。 // 浮動小数点リテラルはそのままだとdouble型になるので、 // float型にするため末尾に「F」を付けます。 f = 2.5F; // それを出力します。 System.out.println( f ); // 2.5 // float型変数に格納された「2.5」がどのように // ビットとして格納されているか見てみます。 outputFloatBit( f ); // 0 10000000 01000000000000000000000 // ↑ ↑ ↑ // 符号 指数部 仮数部 // 詳しくは「浮動小数点」「指数部」「仮数部」の項目を // ご覧ください。 // 正の最大値と正の最小値はFloatクラスのstaticフィールド // として宣言されているのでそれを使いましょう。 f = Float.MAX_VALUE; System.out.println( f ); DecimalFormat decimalFormat = new DecimalFormat( "0.0" ); System.out.println( decimalFormat.format( f ) ); outputFloatBit( f ); // 3.4028235E38 // 340282346638528860000000000000000000000.0 // 0 11111110 11111111111111111111111 f = Float.MIN_VALUE; System.out.println( f ); decimalFormat = new DecimalFormat( "0.0000000000000000000000000000000000000000000000000000000000000" ); System.out.println( decimalFormat.format( f ) ); outputFloatBit( f ); // 1.4E-45 // 0.0000000000000000000000000000000000000000000014012984643248170 // 0 00000000 00000000000000000000001 // ただし、ビットを見れば分かりますがどちらも「指数部と仮数部、 // それぞれ取りうる値」としての最大値と最小値です。正負は最初の // ビットだけで決まるので、マイナスにすれば「負の~」となります。 // float型は浮動小数点なので、誤差には気を付けてください。 float f1 = 4.1F; float f2 = 8.2F; System.out.println( f1 + f2 ); // 12.299999999999999 // このように、簡単に誤差が生じます。 // 正確な値が必要な場合にはBigDecimalクラスを使用しましょう。 } /** * float型変数をビット形式で出力します。 */ private static void outputFloatBit( float f ) { // float型変数をビット形式で文字列化します。 String source = Integer.toBinaryString( Float.floatToIntBits( f ) ); // 左0埋めします。 StringBuffer strbuf = new StringBuffer(); for( int iF1 = source.length(); iF1 < 32; ++iF1 ) { strbuf.append( "0" ); } strbuf.append( source ); // 符号、仮数部、指数部の間にスペースを入れます。 strbuf.insert( 9, " " ); strbuf.insert( 1, " " ); System.out.println( strbuf.toString() ); } }