数値型
数値型には、整数型と浮動小数点型の2つがある。
整数型
数値型は符号なし(正の数のみ)と符号付き(正と負)がある。
符号なしの型は負の数を使わない分、大きな数を格納できるが、.NET言語の中には符号なしの型をサポートしていない言語もある。
そのため負の数を返すことがないLengthプロパティなどにも符号付きの型であるintが採用されている。
最も一般的に使う整数型はintである。大抵の数値を表現できる範囲を備えており、.NETでサポートしているすべてのCPU上で効率的に動作するためである。
整数を扱う場合は、たいていintで定義すればよい。
浮動小数点型
C#で扱える浮動小数点型にはfloat(単精度)とdouble(倍精度)とdecimalがある。
浮動小数点数のビット構造は以下のようになっている。基数は2(float/double)か10(decimal)で固定。(ビット中には情報が含まれていない)
|S(符号)|E(指数部)|M(仮数部)|
2進浮動小数点型(doubleとfloat)
基数が2で固定となっている。
doubleのほうがビット数が倍であり、広い範囲を表現できる。
通常、小数を扱う場合はfloatではなくdoubleを使う。
コンパイラは小数を暗黙的にdoubleと認識する。これをfloatやdecimalと認識させたい場合は数値の末尾にサフィックス(接尾辞)を付ける。
2進数で小数を格納するため、2進浮動小数点数は小数を正確に表現できない。
2進浮動小数点型を使う場合は誤差を許容する計算に限るべきである。(誤差が許されないお金の計算などにはdecimalを使う)
C#型 | ビットサイズ | 有効桁数 | 範囲 |
float | 32 | 7桁(23ビット) | 1.5×10^-45~3.4×10^38 |
double | 64 | 15桁(52ビット) | 5.0×10^-324~1.7×10^308 |
1 2 3 4 5 6 7 |
double hoge = 0; for (int i = 0; i < 10; i++) { hoge += 0.1; Console.WriteLine(hoge); } |
1 2 3 4 5 6 7 8 9 10 |
0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.7999999999999999 0.8999999999999999 0.9999999999999999 |
decimal型
正確な小数の計算のために設計された型。10進浮動小数点型であり、基数が10となっている。
128ビットの値であり、28桁以内の小数の計算が正確にできる。そのため精度が要求される小数の計算を行う場合は必ずdecimalを使う。
ただし、CPUがサポートしていない型であるため、floatやdoubleに比べて計算は遅くなる。
以下のサイトによると5倍の差があるとのこと。
Teras: C#でDecimalの演算速度が遅いので速度比較 (terasb.blogspot.com)
1 2 3 4 5 6 7 |
decimal hoge = 0m; //サフィックスmを付ける for (int i = 0; i < 10; i++) { hoge += 0.1m; //サフィックスmを付ける Console.WriteLine(hoge); } |
1 2 3 4 5 6 7 8 9 10 |
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 |
コード上での表記法
プレフィックス(接頭辞)
プレフィックスを使うと、16進数や2進数で数値を表記できる。エラーメッセージなどは16進数のほうが分かりやすいため16進数が用いられている。
16進数のプレフィックスは0x (ゼロ エックス)
2進数のプレフィックスは0b (ゼロ ビー)
1 2 3 4 5 |
int h = 0x6AF;//16進数で表す Console.WriteLine(h);//1711と表示 int b = 0b0010; //2進数で表す Console.WriteLine(b);//2と表示 |
サフィックス(接尾辞)
コンパイラは暗黙的に型を選択する機能がある。整数はその値を含む型のうち、範囲の狭いものから選択される。たとえば、10はintが選択され、2200000000はuintが選択される。また、小数の場合はdoubleが選択される。
このような場合は、数値リテラルの末尾にサフィックスを付けることで、型を指定できる。
long型を表すサフィックスはL、decimal型を表すサフィックスはMである。サフィックスは大文字でも小文字でもよい。ただしLはIと区別するため大文字で書くことが多い。
また、順序も関係なく、ulongのサフィックスをULとしても、LuとしてもLUとしてもよい。
型 | サフィックス |
uint | U |
long | L |
ulong | UL |
float | F |
double | D |
decimal | M |
浮動小数点数の表記
大きな浮動小数点数を表すには、仮数にEをつけ、(基数10の)指数を続ける「指数リテラルフォーマット」を使用すると間違いが少ない。
このフォーマットでは、あとに何もつけない場合はdouble型となる。floatやdecimalで表したい場合はサフィックスF,Mを末尾に加える。
1 2 3 4 5 6 7 8 9 10 11 |
//1.5^30 double d = 1.5E30; Console.WriteLine(d); //3.0^-23 double e = 3.0E-23; Console.WriteLine(e); float f = 2.5E15F; decimal g = 335E24M; |
数値の区切り文字
日常で大きな数を表す場合、わかりやすいようにカンマで桁を区切る場合がある。
3,000,000
ただしこのような区切り文字にカンマではなくピリオドを用いる国もある。(そのような国では小数点にカンマを用いる)
コード上でもこのような区切り文字を使うことができるが、この場合は_(アンダースコア)を使う。
実際には、アンダースコアを付けない通常の数値リテラルとして内部的に認識されている。
ちなみに、2進数と16進数では4桁ごとに区切るのが一般的。
1 2 |
int j = 5_000_000; Console.WriteLine(j); //5000000と表示 |
文字列と数値の加算
文字列と数値を+演算子で加算すると、数値は自動的にToString()メソッドが呼ばれ、文字列に変換されたあとString.Concat()が呼ばれ、結合される。
数値以外の型も、すべてToString()を備えており、+演算子で文字列に結合することができる。
1 2 3 |
bool ishoged = true; var str = "あいうえお" + 123 + "ABC" + 2.0 + ishoged; Console.WriteLine(str); |
1 |
あいうえお123ABC2True |
コメント