次の方法で共有


浮動小数点数値型 (C# リファレンス)

浮動小数点数値型は実数を表します。 すべての浮動小数点数値型は 値型です。 これらは 単純型 でもあり、 リテラルで初期化できます。 すべての浮動小数点数値型は、 算術演算子、 比較演算子、等 演算子をサポートします。

浮動小数点型の特性

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.NaNDouble.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# 言語仕様」の次のセクションを参照してください。

こちらも参照ください