【C#】double型の仕様・使い方についてわかりやすく詳しく解説

C#プログラミングにおいて、数値を扱う際によく使われるdouble型。

初心者の方でも簡単に理解できるよう、今回はdouble型の仕様や使い方についてサンプルコードも交えながら詳しく解説します。

目次

double型とは

double型は、C#で浮動小数点数を表現するためのデータ型の一つです。

double型は倍精度浮動小数点数を表現することができ、1つの値・変数につき64ビット(8バイト)のメモリを使用します。

double num1 = 3.14159;
double num2 = 1000000000.0;

double型の特徴

C#において、double型は浮動小数点数を表現するためのデータ型です。double型は、float型よりも精度が高く、範囲も広いため、より正確な計算が必要な場合に使用されます。

精度

double型は64ビットの浮動小数点数を表現することができます。これにより、非常に高い精度で計算を行うことができます。

ただし、double型でも完全な精度を保証することはできません。例えば、0.1230123012301230123+ 0.2 の結果は桁落ちが発生して0.323012301230123となる(4桁消失)ため、注意が必要です。

範囲

double型は非常に大きな値や小さな値を表現することができます。

最大値は1.7976931348623157E+308(約10の308乗)、最小値は4.94065645841247E-324(約10の-324乗)です。

メモリ使用量

double型は64ビットの浮動小数点数を表現するため、メモリ使用量もfloat型よりも多くなります。

しかし、現代のコンピューターではメモリ容量が増加しているため、一般的に問題になることはありません。

double型の宣言方法

C#でdouble型を使用するには、変数の宣言やリテラルの宣言が必要です。

変数の宣言

変数とは、データを格納するための箱のようなものです。double型の変数を宣言する場合は、以下のように記述します。

double num;

このように記述することで、numという名前のdouble型の変数が作成されます。 また、初期値を設定したい場合は以下のように記述します。

double num = 3.14;

この場合、numという名前のdouble型の変数が作成され、初期値として3.14が設定されます。

リテラルの宣言

リテラルとは、プログラム中で直接書かれた値を表すものです。例えば、35.2などがリテラルです。double型のリテラルを宣言する場合は、以下のように記述します。

double num1 = 3.14;
double num2 = 5.2d;

num1には3.14が代入されますが、num2には5.2dという値が代入されています。

dDoubleという意味であり、省略可能です。ただし、f(float)やm(decimal)など他のデータ型でも同様に使われるため注意してください。

double型の演算

double型は、数値を扱うためのデータ型です。ここでは、double型に対する演算について解説します。

四則演算

四則演算とは、加算・減算・乗算・除算のことを指します。C#では、以下のように記述します。

double a = 10.0;
double b = 3.0;
// 加算
double c = a + b; // c = 13.0
// 減算
double d = a - b; // d = 7.0
// 乗算
double e = a * b; // e = 30.0
// 除算
double f = a / b; // f = 3.33333333333333

比較演算

比較演算とは、大小関係や等しいかどうかを判定するための演算です。C#では、以下のように記述します。

double a = 10.0;
double b = 3.0;
// 大小関係(aがbより大きい)
bool c1 = a > b; // c1 = true 
// 大小関係(aがb以上)
bool c2 = a >= b; // c2 = true 
// 大小関係(aがbより小さい)
bool c3 = a < b; // c3= false 
// 大小関係(aがb以下)
bool c4 = a <= b; // c4= false 
// 等しいかどうか(aとbが等しい)
bool d1 = a == b; // d1= false 
// 等しいかどうか(aとbが等しくない)
bool d2 = a != b; // d2= true 

その他の演算

その他にも、次のような演算があります。

  • 剰余:余りを求める演算子 % を使用します。
  • インクリメント/デクリメント:変数を1増やす/減らす操作です。
  • 複合代入:代入と同時に計算する操作です。例えば += 演算子は、「左辺の変数に右辺の値を加えた結果を左辺に代入する」という意味です。 以上で、C#での double型 の基本的な演算方法について解説しました。

double型の注意点

double型は、浮動小数点数を扱うためのデータ型ですが、その特性上いくつか注意点があります。

丸め誤差

double型は、内部的に2進数で表現されるため、10進数で表現するときに誤差が生じることがあり、これを丸め誤差といいます。

例えば、 以下のコードでは、0.1を1000回足した結果が100.0ではなく99.9999999999986となってしまいます。

double sum = 0;
for (int i = 0; i < 1000; i++)
{
    sum += 0.1;
}
Console.WriteLine(sum); // 結果: 99.9999999999986

このような僅かな誤差ですら許容できない精密性が必要な場合は、より高精度なdecimal型を使用することで丸め誤差を回避することができます。

比較の際の注意点

double型同士を比較する場合も注意が必要です。例えば、以下のコードでは期待通りに動作しません。

double a = 0.1 + 0.2;
double b = 0.3;
if (a == b)
{
    Console.WriteLine("aとbは等しい");
}
else
{
    Console.WriteLine("aとbは等しくない");
}

0.3と0.3を比較しているだけに見えるプログラムですが、結果は、aとbは等しくないと表示されます。

これは、先程述べた丸め誤差によるものです。double型同士を比較する場合は、ある程度許容範囲を設けて比較する必要があります。

以下のコードでは、Math.Absメソッドを使用して2つの値の差分が一定範囲内かどうか判断しています。

const double epsilon = 1e-15; // 許容範囲
if (Math.Abs(a - b) < epsilon)
{
    Console.WriteLine("aとbは等しい");
}
else
{
    Console.WriteLine("aとbは等しくない");
}

NaNとInfinity

double型には、「NaN(Not a Number)」や「Infinity(無限大)」など特殊な値も存在します。

NaNは計算結果が未定義または不正であることを示す値であり、Infinityはオーバーフローした場合やゼロ除算した場合に発生します。 以下のコードでは、0 / 01 / 0を計算しています。

Console.WriteLine(0.0 / 0.0); // 結果: NaN
Console.WriteLine(1.0 / 0.0); // 結果: Infinity

NaNやInfinityが発生する可能性がある場合、これらの特殊な値も含めて考慮したプログラムを作成する必要があります。

目次