数値型について
VB.NETで扱う数値型について説明します。
VB.NETで扱う数字型は主に4つです。
Integer 型 (整数型)
Long 型 (整数型)
Double 型 (倍精度浮動小数点数型)
Decimal 型 (10進型)
上記以外も使いますが、殆どの場合上記いずれかを使うと思って問題ないです。
書いてみたら意外とボリュームがあったので、先に書きますが、これだけ覚えていれば問題ないです。
Integer 型 (整数型)
整数のみを格納できます。
一番一般的な数字型です。
範囲は、-2,147,483,648 ~ 2,147,483,647 に収まる必要があります。
この範囲を超えるとSystem.OverflowException が発生します。
本当の名前は、Int32と言います。
Module Module1 Sub Main() Dim num As Integer Console.WriteLine(num.GetType) 'System.Int32 Console.WriteLine(Integer.MaxValue) ' 2147483647 Console.WriteLine(Integer.MinValue) '-2147483648 '既定値は 0 Console.WriteLine(num) '0 num = 2147483647 Console.WriteLine(num + 1) 'System.OverflowException: 算術演算の結果オーバーフローが発生しました。 End Sub End Module
Long 型 (整数型)
整数のみを格納できます。
Integer 型で補えない大きな数字を扱えます。
範囲は、-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 に収まる必要があります。
この範囲を超えるとSystem.OverflowException が発生します。
本当の名前は、Int64と言います。
Module Module1 Sub Main() Dim lon As Long Console.WriteLine(lon.GetType) 'System.Int64 Console.WriteLine(Long.MaxValue) ' 9223372036854775807 Console.WriteLine(Long.MinValue) '-9223372036854775808 '既定値は 0 Console.WriteLine(lon) '0 lon = 9223372036854775807 Console.WriteLine(lon + 1) 'System.OverflowException: 算術演算の結果オーバーフローが発生しました。 End Sub End Module
Double型 (倍精度浮動小数点数型)
小数点を含む実数を格納できます。
範囲は、
-1.79769313486231570E+308 ~ -4.94065645841246544E-324 (負の値)。
4.94065645841246544E-324 ~ 1.79769313486231570E+308 (正の値)。
に収まる必要があります。
Module Module1 Sub Main() Dim dou As Double Console.WriteLine(dou.GetType) 'System.Double Console.WriteLine(Double.MaxValue) ' 1.79769313486232E+308 Console.WriteLine(Double.MinValue) '-1.79769313486232E+308 '既定値は 0 Console.WriteLine(dou) '0 End Sub End Module
Doubleを扱う場合に気を付けなければならないのは、実は小数点以下の計算が合わなくなることがあることです。
例えば 0.1 + 0.2 = 0.3 (真)とはなりません。
これは、内部的には 0.3以降も続きがあり、0.30000000000000004… という数を丸めて扱っているためです。
ちょっと難しい話になるのですが、これは内部的に管理しているのが2進数の指数で管理しているため近似値を扱っているためです。
このような小数点以下の小さい数字まで正確に計算するためには次で紹介するDecimal 型を使う必要があります。
Module Module1 Sub Main() ' Double を使った計算 Dim dou1 As Double = 0.1 Dim dou2 As Double = 0.2 Console.WriteLine(dou1 + dou2) '0.3 Console.WriteLine(dou1 + dou2 = 0.3) 'False Console.WriteLine((dou1 + dou2).ToString("G17")) '0.30000000000000004 ' Decimal を使った計算 Dim dec1 As Decimal = 0.1 Dim dec2 As Decimal = 0.2 Console.WriteLine(dec1 + dec2) '0.3 Console.WriteLine(dec1 + dec2 = 0.3) 'True Console.WriteLine((dec1 + dec2).ToString("G17")) '0.3 End Sub End Module
Decimal型 (10進型)
小数点を含む実数を格納できます。
VB.NETでは、最大の有効桁数を持ちますが、その反面すべての数値型の中で最も低速です。
誤差を許さない金額などを扱う場合に用います。
範囲は、79228162514264337593543950335~ -79228162514264337593543950335に収まる必要があります。
なぜ、Double型は誤差が出るのにDecimal型は誤差が出ないかと言えば、管理しいるのが10進数の指数だからです。コンピューターは2進数が好きです。その代わり2進数では正しく表現出来ない場面があります。そこで10進数の出番ですが、コンピューターは10進数が苦手です。その中でも最大の桁数を誇るDecimal型が数値型の中で最も低速なのはあたりまえですね。
Module Module1 Sub Main() Dim dec As Decimal Console.WriteLine(dec.GetType) 'System.Decimal Console.WriteLine(Decimal.MaxValue) '79228162514264337593543950335 Console.WriteLine(Decimal.MinValue) '-79228162514264337593543950335 '既定値は 0 Console.WriteLine(dec) '0 End Sub End Module
また、大きな数字を扱う場合、明示的にDecimal 型を表す文字 「D」を付ける必要があります。
これは、Decimal 型変数 dec2 に 値をセットする前に 9223372036854775808 をLong 型としてコンパイルするためです。(Long型 で扱える最大値は 9223372036854775807) 数値リテラルである 9223372036854775807 に D を付ける事で コンパイラにDecimal 型と認識させます。
Module Module1 Sub Main() Dim dec1 As Decimal = 9223372036854775807 ' No overflow. Dim dec2 As Decimal = 9223372036854775808 ' Overflow. Dim dec3 As Decimal = 9223372036854775808D ' No overflow. End Sub End Module
おまけ
あまり使う事はないですが、こんなのもあるよ程度に覚えておけば問題ないです。
Short 型 (整数型)
整数のみを格納できます。
範囲は、-32,768 ~ 32,767 に収まる必要があります。
この範囲を超えるとSystem.OverflowException が発生します。っと思わせて発生しません。
範囲を超えると自動的にInteger 型 に変換されます。
昔はメモリの節約のために使う事もありましたが、現在では特に制約がなければ、上位交換のInteger 型を使います。
Module Module1 Sub Main() Dim num As Short Console.WriteLine(num.GetType) 'System.Int16 Console.WriteLine(Short.MaxValue) ' 32767 Console.WriteLine(Short.MinValue) '-32768 '既定値は 0 Console.WriteLine(num) '0 Console.WriteLine(Short.MaxValue + 1) '32768 ' System.OverflowException: は発生しません。 ' 暗黙的に型変換が行われる Console.WriteLine(Short.MaxValue.GetType) 'System.Int16 Console.WriteLine((Short.MaxValue + 1).GetType) 'System.Int32 End Sub End Module
Single 型 (浮動小数点数型)
小数点を含む実数を格納できます。
範囲は、-3.402823E+38~ 3.402823E+38に収まる必要があります。
こちらも昔はメモリの節約のために使う事もありましたが、現在では特に制約がなければ、上位交換の上位交換の Double 型 を使う事が多く殆ど出番がありません。
Module Module1 Sub Main() Dim sig As Single Console.WriteLine(sig.GetType) 'System.Single Console.WriteLine(Single.MaxValue) ' 3.402823E+38 Console.WriteLine(Single.MinValue) '-3.402823E+38 ' 既定値は 0 Console.WriteLine(sig) '0 End Sub End Module
まとめ
色々書きましたが、数値型って意外と奥が深いです。
ですのでもう一度書きますが、これだけ覚えておいて下さい。
コメント