はじめに
【C#(シーシャープ)】 はMicrosoft社が開発した
プログラミング言語で、C++やJavaに似た構文を持ち
.NET Framework上で稼働するWindowsアプリの開発や
Webアプリケーション開発のためのフレームワークである
ASP.NETが使用可能なプログラム言語です。
このメモは、C#の基本的な記載方法のまとめです。
前回
同じ型どうしの計算
整数同士の割り算を行うと、小数点以下が切り捨てられる
using System;
class Program
{
static void Main()
{
int a = 7;
int b = 2;
// 割り算の結果を計算します
int result = a / b;
// 結果を表示します
Console.WriteLine($"{a} / {b} = {result}");
}
}
実行結果※1
7 / 2 = 3
本来 3.5 ですが、整数型の割り算では小数点以下が切り捨てられるため、結果は 3 となります。
キャスト演算子
割り算を行う前に、実数型(doubleやfloatなど)に変換すると小数点以下の値が保持される
using System;
class Program
{
static void Main()
{
int a = 7;
int b = 2;
// 割り算の結果を計算する前に
// aまたはbをdecimalにキャストします。
decimal result = (decimal)a / b;
// 結果を表示します
Console.WriteLine($"{a} / {b} = {result}");
}
}
実行結果
7 / 2 = 3.5
decimal型を使って計算すると、整数型同士の割り算でも切り捨てが発生せず、正確な結果が得られます。
ただし、以下に注意が必要です。
・decimal型は、他の数値型(intやdouble)に比べて
計算処理が遅い。
・メモリ使用量が大きい
・科学計算や工学的な計算では、浮動小数点数を使用し、
広い範囲の数値を効率的に扱えるdouble型が適しています。
浮動小数点演算との互換性
異なる型の演算を行うと、暗黙的な型変換が発生し、予期しない結果を引き起こす可能性があります。
using System;
class Program
{
static void Main()
{
decimal decimalValue = 1.1m; // decimal型
double doubleValue = 2.2; // double型
// decimalとdoubleの混合計算※2
var result = decimalValue + (decimal)doubleValue;
// 結果を表示します
Console.WriteLine($"Result: {result}");
}
}
decimal型とdouble型は直接計算できません。
型の違いによる精度の問題が発生するため、
doubleValueをdecimalにキャスト(変換)する必要があります。
キャストなしの場合
var result = decimalValue + doubleValue;
これだとコンパイルエラーになります
精度の違い
double型は二進浮動小数点数として格納されるため、
1.1や2.2のような値を正確に表現できないことがあります。
decimal型は十進浮動小数点数で格納されるため、
金融計算などで必要な高い精度を保てます。
仮に両方の型を同じ演算に使用した場合、
結果の精度が予期せず低下する。
double型の精度が低いため、
decimalにキャストしても元のdoubleの誤差が残る。
まとめ
decimalとdoubleを混在して使うときは、意図しない結果や精度の低下を招く可能性があります。計算を行う前に、どちらかの型に明示的にキャストして、意図した型で演算を行うことが重要です。
※1
フォーマット指定子 ($) を記号を使った文字列補間を利用して、簡単に変数や計算式の値を文字列に埋め込む
{a} は、変数 a の値(7)が置き換えられます。
{b} は、変数 b の値(2)が置き換えられます。
{result} は、a / b の計算結果の値(3)が置き換えられます。
Console.WriteLineを使って引数を指定し、フォーマットする例
int x = 5; // 引数1:整数5を変数xに代入
int y = x * 10; // 引数2:xを10倍した結果を変数yに代入
// Console.WriteLineを使用して、引数xとyを指定して出力
Console.WriteLine("x = {0}, xの10倍は {1}です", x, y);
実行結果
x = 5, xの10倍は 50です
※2
次回
参考文献
C#関連情報サイト様