算術演算子とは
算術演算子は、数値に対して基本的な数学的操作を行うために使用されます。以下は、C#でよく使用される算術演算子の一覧です。
演算子 | 説明 | 例 | 結果 |
+ | 足し算 | 5 + 3 | 8 |
– | 引き算 | 6 – 4 | 2 |
* | かけ算 | 2 * 5 | 10 |
/ | わり算 | 10 / 3 | 3 |
% | 余りを計算する | 10 % 3 | 1 |
++ | インクリメント (1増やす) | i++ | |
— | デクリメント (1減らす) | i– |
演算子「+」には2つの意味がある。
演算子「+」は要注意で、数値型同士の演算であれば足し算をしてくれる(サンプル1行目)のですが、数値型以外で演算を使用する(2~4行目)と、文字列として認識します。
Console.WriteLine(1 + 2); //結果は3
Console.WriteLine("a" + 5); //結果はa5
Console.WriteLine(5 + "b"); //結果は5b
Console.WriteLine("1" + "2") //結果は12
COnsole.WriteLine("a" + DateTime.Now) //結果:a2024/11/10 21:34:00
Console.WriteLine(1 + DateTime.Now); //エラー
5行目がややこしくて、DateTime型は文字列型ではありません。ここではToStringメソッドを暗黙的に使用することで文字列型に変換したうえで相互結合をします。
6行目は片方が数値型の場合、ToStringメソッドを暗黙的に使用せず、エラーになります。
わり算とデータ型
わり算をする時にはオペランドのデータ型に注意が必要です。
整数型同士のわり算であれば、結果も整数型の値が返ってきます。
Console.WriteLine(3 / 4); //結果は0
不思議かも知れませんが整数同士の場合、小数点以下は切り捨てられます。
これが浮動小数点(小数点も扱える数値型)の場合だと話がややこしくなります。
double result = 3 / 4;
Console.WriteLine(result); //結果は0
3 / 4 が整数同士の演算ですので、この時点で整数型になります。
それを暗黙的な型変換を行うのでresultも0になってしまいます。
これを避けるためには整数型を浮動小数点型にキャストすることが必要です。
4行目のように明示的にdouble型にすることで正しい結果が得られます。
doubleに明示的にするには数の後ろに「d」をつけます。(以下のサンプル4行目)
double result = (double)3 / 4;
Console.WriteLIne(result); //結果は0.75
Console.WriteLine(3d / 4);//結果は0.75
さらにわり算でやってはいけない0で割ること。整数型同士のわり算であればエラーが発生しますが、浮動小数点の場合は特殊な値が帰ってきます。
Console.WriteLine(3 / 0); //エラー
Console.WriteLine(3 % 0); //エラー
Console.WriteLine(3d / 0);//結果は∞
Console.WriteLine(3d % 0);//結果はNaN
浮動小数点の演算には要注意
Console.WriteLine(Math.Floor((0.7 + 0.1) * 10));//結果は7
MathクラスのFloorメソッドは引数の数値を小数点以下切り捨てる為の命令です。
従ってFloor(0.7 + 0.1)は0.8になり10倍するので正解は8なのですが、どうしてこういうことが起きるのでしょう。
ここからは相当入り組んでくるので簡単に説明しますと、浮動小数点型は実行環境では2進数で表現されます。そのため、小数点には殆どの場合型落ちが発生します。この結果を見ると0.7 + 0.1は厳密には0.8とはならず、(0.7999999…..)となり10倍しても8ではなく7.999999…と表現されるのです。
浮動小数点型は整数型の範囲で収まる数以外の数値を扱う時には特に注意が必要です。
まとめ
今回は算術演算子について学びました。一般の数学で出てくる算術演算子と基本的には同じです。
しかし、一部の演算子については注意が必要です。
+演算子には二つの顔(数値同士の演算と文字列の演算で動作が異なる)を持っていること
0割演算は数値型によってはエラーとならずに処理が続行することがあること(無論意味の分からない数値が入りますが)
double型の演算では小数点以下の計算する時には想定しない丸め誤差が発生すること
があげられます。
コメント