浮動小数点数値型は実数を表します。 すべての浮動小数点数値型は 値型です。 これらは 単純型 でもあり、 リテラルで初期化できます。 すべての浮動小数点数値型は、 算術演算子、 比較演算子、等 値 演算子をサポートします。
浮動小数点型の特性
C# では、次の定義済みの浮動小数点型がサポートされています。
C#のタイプまたはキーワード | おおよその範囲 | 精度 | サイズ | .NET 型 |
---|---|---|---|---|
float |
±1.5 x 10-45 から ±3.4 x 1038 | 最大 6 ~ 9 桁 | 4 バイト | System.Single |
double |
±5.0 × 10-324 から ±1.7 × 10308 | 最大 15 ~ 17 桁 | 8 バイト | System.Double |
decimal |
±1.0 x 10-28 から ±7.9228 x 1028 | 28 ~ 29 桁の数字 | 16 バイト | System.Decimal |
前の表では、左端の列の各 C# 型キーワードは、対応する .NET 型のエイリアスです。 これらは交換可能です。 たとえば、次の宣言では、同じ型の変数を宣言します。
double a = 12.3;
System.Double b = 12.3;
各浮動小数点型の既定値は 0 ( 0
) です。 各浮動小数点型には、その型の最小および最大の有限値を提供する MinValue
定数と MaxValue
定数があります。
float
型とdouble
型には、数値以外の値と無限大の値を表す定数も用意されています。 たとえば、 double
型には、 Double.NaN、 Double.NegativeInfinity、および Double.PositiveInfinityの定数が用意されています。
decimal
型は、小数点の右側の桁数によって必要な精度が決定される場合に適しています。 このような数値は、金融アプリケーションでよく使用されます。通貨額 (例: $1.00)、利率 (たとえば、2.625%) などです。 1 つの 10 進数のみに正確な数値であっても、 decimal
の型によってより正確に処理されます。たとえば、0.1 は、 decimal
インスタンスで正確に表すことができますが、0.1 を正確に表す double
または float
インスタンスはありません。 この数値型の違いにより、10 進データに double
または float
を使用すると、算術計算で予期しない丸めエラーが発生する可能性があります。 精度を確保するよりもパフォーマンスを最適化することが重要な場合は、decimal
の代わりにdouble
を使用できます。 ただし、パフォーマンスの違いは、最も計算負荷の高いアプリケーション以外では気付かないでしょう。
decimal
を回避するもう 1 つの考えられる理由は、ストレージ要件を最小限に抑えるためです。 たとえば、 ML.NET では、4 バイトと 16 バイトの差が非常に大きなデータ セットに加算されるため、 float
が使用されます。 詳細については、System.Decimalを参照してください。
式には、整数型とfloat
型とdouble
型を混在させることができます。 この場合、整数型は浮動小数点型のいずれかに暗黙的に変換され、必要に応じて、 float
型は暗黙的に double
に変換されます。 式は次のように評価されます。
- 式に
double
型がある場合、式はdouble
、またはリレーショナル比較と等価比較でbool
評価されます。 - 式に
double
型がない場合、式はfloat
、またはリレーショナル比較と等価比較でbool
評価されます。
式で整数型と decimal
型を混在させることもできます。 この場合、整数型は暗黙的に decimal
型に変換され、式は decimal
に評価されるか、リレーショナル比較と等価比較で bool
されます。
式の decimal
型と float
型と double
型を混在させることはできません。 この場合、算術演算、比較演算、または等値演算を実行する場合は、次の例に示すように、オペランドを decimal
型からまたは 型に明示的に変換する必要があります。
double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);
標準の数値書式指定文字列またはカスタム数値書式指定文字列を使用して、浮動小数点値を書式設定できます。
実数リテラル
実際のリテラルの型は、サフィックスによって次のように決定されます。
- サフィックスのないリテラル、または
d
またはD
サフィックスを持つリテラルは型ですdouble
-
f
またはF
サフィックスを持つリテラルは型ですfloat
-
m
またはM
サフィックスを持つリテラルは型ですdecimal
次のコードは、それぞれの例を示しています。
double d = 3D;
d = 4d;
d = 3.934_001;
float f = 3_000.5F;
f = 5.4f;
decimal myMoney = 3_000.5m;
myMoney = 400.75M;
前の例では、_
を桁区切り記号として使用する方法も示しています。 桁区切り記号は、すべての種類の数値リテラルと共に使用できます。
次の例に示すように、指数表記を使用することもできます。つまり、実際のリテラルの指数部を指定します。
double d = 0.42e2;
Console.WriteLine(d); // output 42
float f = 134.45E-2f;
Console.WriteLine(f); // output: 1.3445
decimal m = 1.5E6m;
Console.WriteLine(m); // output: 1500000
コンバージョン
浮動小数点数値型の間には、 float
から double
への暗黙的な変換が 1 つだけあります。 ただし、 明示的なキャストを使用して、任意の浮動小数点型を他の浮動小数点型に変換できます。 詳細については、「 組み込みの数値変換」を参照してください。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
こちらも参照ください
.NET