C# で整数と浮動小数点数を使用する方法
このチュートリアルでは、C# の数値型について説明します。 少量のコードを記述したら、そのコードをコンパイルして実行します。 このチュートリアルには、C# の数値と算術演算に関する一連のレッスンが含まれています。 これらのレッスンでは、C# 言語の基本を説明します。
ヒント
フォーカス モード内にコード スニペットを貼り付けるには、キーボード ショートカット (Ctrl + v、または cmd + v) を使用する必要があります。
前提条件
このチュートリアルでは、ローカル開発用にセットアップされたコンピューターがあることを想定しています。 インストール手順と .NET でのアプリケーション開発の概要については、「ローカル環境をセットアップする」を参照してください。
ローカル環境のセットアップをスキップしたい場合は、このチュートリアルの対話型 (ブラウザー内) バージョンを参照してください。
整数の演算の確認
「numbers-quickstart」という名前のディレクトリを作成します。 それを現在のディレクトリにして、次のコマンドを実行します。
dotnet new console -n NumbersInCSharp -o .
重要
.NET 6 の C# テンプレートでは "最上位レベルのステートメント" が使用されます。 .NET 6 に既にアップグレードしている場合、お使いのアプリケーションはこの記事のコードに一致しないかもしれません。 詳細については、「新しい C# テンプレートで、最上位レベルのステートメントが生成される」の記事を参照してください。
.NET 6 SDK により、次の SDK を使用するプロジェクトに対して "暗黙的な" ディレクティブ セットも追加されます。
- Microsoft.NET.Sdk
- Microsoft.NET.Sdk.Web
- Microsoft.NET.Sdk.Worker
これらの暗黙的な global using
ディレクティブには、プロジェクトの種類に応じて最も一般的な名前空間が含まれます。
詳細については、「暗黙的な using ディレクティブ」の記事を参照してください
好みのエディターで Program.cs を開き、ファイルの内容を次のコードで置き換えます。
int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);
コマンド ウィンドウで「dotnet run
」を入力し、このコードを実行します。
整数を使用した基本的な算術演算の 1 つを確認しました。 int
型は、int
を表します (ゼロ、正の整数、または負の整数)。 加算には +
記号を使用します。 他の一般的な整数の算術演算には次のものがあります。
-
: 減算*
: 乗算/
: 除算
まずは、上記の各種演算を実行してみます。 c
の値を記述した行の後に、次の数行を追加します。
// subtraction
c = a - b;
Console.WriteLine(c);
// multiplication
c = a * b;
Console.WriteLine(c);
// division
c = a / b;
Console.WriteLine(c);
コマンド ウィンドウで「dotnet run
」を入力し、このコードを実行します。
必要であれば、同じ行で複数の算術演算を記述することもできます。 例として c = a + b - 12 * 17;
を試してみてください。 変数と定数を混在させることができます。
ヒント
C# (または何らかのプログラミング言語) について詳しく学習するに従い、コードを記述する際にミスをすることもあるでしょう。 コンパイラは、そうしたエラーを発見して報告します。 エラー メッセージが出力された場合は、例のコードをよく確認して、ウィンドウで修正すべきコードを見つけます。 こうした実習が C# コードの構造を理解するのに役立ちます。
最初の手順が完了しました。 次のセクションを始める前に、現在のコードを別の "メソッド" に移動しましょう。 メソッドは、グループ化された一連のステートメントであり、名前が付けられています。 メソッドを呼び出すには、メソッドの名前の後に ()
を記述します。 コードをメソッドに整理しておくと、新しい例の作業を簡単に始めることができます。 完成したコードは次のようになります。
WorkWithIntegers();
void WorkWithIntegers()
{
int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);
// subtraction
c = a - b;
Console.WriteLine(c);
// multiplication
c = a * b;
Console.WriteLine(c);
// division
c = a / b;
Console.WriteLine(c);
}
WorkWithIntegers();
の行でメソッドを呼び出しています。 その後のコードでメソッドが宣言され、定義されています。
演算の順序の確認
WorkingWithIntegers()
の呼び出しをコメント アウトします。 こうしておくと、このセクションの作業を進めるにあたって出力がすっきりします。
//WorkWithIntegers();
C# では、//
の後ろが//
になります。 コードとしては実行せずにソース コード内に残したい任意のテキストを、コメントにすることができます。 コンパイラは、コメントから実行可能コードを生成しません。 WorkWithIntegers()
はメソッドであるため、コメントアウトする必要があるのは 1 行だけです。
C# 言語は、数学で学んだ規則と同じ規則で各演算の優先順位を定義します。 乗算と除算は、加算と減算よりも優先されます。 WorkWithIntegers()
の呼び出しの後に次のコードを追加し、dotnet run
を実行して、それを調べます。
int a = 5;
int b = 4;
int c = 2;
int d = a + b * c;
Console.WriteLine(d);
出力を見ると、加算の前に乗算が実行されていることがわかります。
最初に実行したい演算を囲むように丸かっこを追加することで、演算の順序を変えることができます。 次の行を追加して、もう一度実行します。
d = (a + b) * c;
Console.WriteLine(d);
さまざまな演算を多数組み合わせて、他にも試してみましょう。 次の行のようなものを何か追加します。 もう一度 dotnet run
を実行してください。
d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
Console.WriteLine(d);
整数について面白い動作をしていることに気づいたでしょうか。 結果に小数点や小数部分が含まれると予想される場合でも、整数の除算は常に整数の結果を算出します。
この動作を確認できない場合は、次のコードを試してください。
int e = 7;
int f = 4;
int g = 3;
int h = (e + f) / g;
Console.WriteLine(h);
もう一度 dotnet run
を入力して結果を確認します。
続行する前に、このセクションで記述したコードをすべて新しいメソッドに移します。 新しいメソッドを OrderPrecedence
とします。 コードは次のようになります。
// WorkWithIntegers();
OrderPrecedence();
void WorkWithIntegers()
{
int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);
// subtraction
c = a - b;
Console.WriteLine(c);
// multiplication
c = a * b;
Console.WriteLine(c);
// division
c = a / b;
Console.WriteLine(c);
}
void OrderPrecedence()
{
int a = 5;
int b = 4;
int c = 2;
int d = a + b * c;
Console.WriteLine(d);
d = (a + b) * c;
Console.WriteLine(d);
d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
Console.WriteLine(d);
int e = 7;
int f = 4;
int g = 3;
int h = (e + f) / g;
Console.WriteLine(h);
}
整数の有効桁数と制限の確認
この最後のサンプルでは、整数の除算における結果の切り捨てについて確認します。 modulo 演算子 ( 文字) を使用して、剰余を得ることができます。 OrderPrecedence()
のメソッド呼び出しの後で、次のコードを試します。
int a = 7;
int b = 4;
int c = 3;
int d = (a + b) / c;
int e = (a + b) % c;
Console.WriteLine($"quotient: {d}");
Console.WriteLine($"remainder: {e}");
C# の整数型は算術における整数ともう 1 つ異なる点があります。それは int
型には最小値と最大値の制限があるということです。 次のコードを追加して、それらの制限を確認します。
int max = int.MaxValue;
int min = int.MinValue;
Console.WriteLine($"The range of integers is {min} to {max}");
計算によってこれらの制限を超える値が作られると、アンダーフローまたはオーバーフローの状態になります。 計算の結果が 1 つの制限からもう 1 つの制限に折り返されているように見えます。 次の 2 行を追加して、例を確認します。
int what = max + 3;
Console.WriteLine($"An example of overflow: {what}");
計算の結果が最小値の (負の) 整数に極めて近いことに注目してください。 これは min + 2
と同じです。 加算演算が許容された整数値をオーバーフローしました。 整数がオーバーフローして最大値から最小値に ”折り返され” たため、計算結果が非常に大きな負の値になっています。
他にもさまざまな制限や有効桁数を持つ数値型があり、int
型がご自分のニーズと合わない場合は、そちらも使用できます。 次に、その他の型について説明します。 次のセクションを始める前に、このセクションで記述したコードを別のメソッドに移します。 これに TestLimits
という名前を付けます。
double 型の処理
double
数値型は、倍精度浮動小数点数を表します。 こうした用語を初めて見た人もいるかもしれません。 浮動小数点数は、非常に大きな、または非常に小さな、整数ではない数値を表すのに役立ちます。 倍精度は、値の保管に使用される二進数の数値を表す相対語です。 倍精度数値は、単精度に比べ、二進数の数値が 2 倍になります。 最近のコンピューターでは、単精度よりも倍精度の数値を使用する方が一般的です。 単精度数値は、 キーワードを使用して宣言されます。 確認してみましょう。 次のコードを追加して結果を確認します。
double a = 5;
double b = 4;
double c = 2;
double d = (a + b) / c;
Console.WriteLine(d);
計算結果に商の小数部分が含まれていることに注目してください。 double 型を使用して、もう少し複雑な式を試します。
double e = 19;
double f = 23;
double g = 8;
double h = (e + f) / g;
Console.WriteLine(h);
double 値は整数値よりも範囲が大きくなります。 これまでに記述したコードの下で、次のコードを試します。
double max = double.MaxValue;
double min = double.MinValue;
Console.WriteLine($"The range of double is {min} to {max}");
これらの値は指数表記で出力されます。 E
の左側は有効数字です。 右側の数値は指数であり、10 の累乗です。 算術における 10 進数と同じように、C# における double には丸め誤差が発生することがあります。 次のコードを試してみましょう。
double third = 1.0 / 3.0;
Console.WriteLine(third);
0.3
の無限の繰り返しは 1/3
と完全に同じではありません。
課題
double
型を使用して、大きい値や小さい値、乗算、除算などの計算してみましょう。 もっと複雑な計算を試してみてください。 しばらく試してみたあとは、これまでに記述したコードを新しいメソッドに移します。 新しいメソッドに WorkWithDoubles
という名前を付けます。
10 進型を扱う
C# の基本的な数値型である整数と double について見てきました。 もう 1 つ知っておくべき型として、decimal
型があります。 decimal
型は、double
型よりも範囲は小さいですが、有効桁数が大きい型です。 では、始めましょう。
decimal min = decimal.MinValue;
decimal max = decimal.MaxValue;
Console.WriteLine($"The range of the decimal type is {min} to {max}");
double
型よりも範囲が小さいことに注目してください。 次のコードを実行すると、decimal 型では有効桁数がより大きいことを確認できます。
double a = 1.0;
double b = 3.0;
Console.WriteLine(a / b);
decimal c = 1.0M;
decimal d = 3.0M;
Console.WriteLine(c / d);
数値の末尾の M
は、定数では decimal
型を使用する必要があることを示しています。 それ以外の場合、コンパイラは double
型を想定します。
注意
文字 M
は、double
キーワードと decimal
キーワードの間で最も視覚的に区別される文字として選択されています。
decimal 型を使用した演算では、小数点の右側の桁数がより多いことに注目してください。
課題
さまざまな数値型を確認したので、次は半径が 2.50 センチメートルの円の面積を計算するコードを記述してみます。 円の面積は、半径の 2 乗 x 円周率です。 ヒント: .NET には Math.PI という円周率の定数があり、その値を使用できます。 Math.PI は、System.Math
名前空間で宣言されているすべての定数と同様に、double
値です。 そのため、この課題では decimal
値の代わりに double
を使用してください。
答えは 19 と 20 の間になるはずです。 GitHub にある完成版のサンプル コードで答えを確認できます。
お好みで他の数式を試してみてください。
これで "C# の数値" に関するクイックスタートは終了です。 続けて独自の開発環境で分岐とループのクイックスタートに進むことができます。
C# の数値の詳細については、次の記事で学習できます。
.NET