【VB.NET】数値型について

VB.NET
この記事は約10分で読めます。

数値型について

VB.NETで扱う数値型について説明します。

VB.NETで扱う数字型は主に4つです。
Integer 型 (整数型)
Long 型 (整数型)
Double 型 (倍精度浮動小数点数型)
Decimal 型 (10進型)
上記以外も使いますが、殆どの場合上記いずれかを使うと思って問題ないです。

書いてみたら意外とボリュームがあったので、先に書きますが、これだけ覚えていれば問題ないです。

20億くらいの計算ならIntegerを使う
20億以上の数字を扱うならLongを使う
小数点を使うけど、精度は気にしなくていいならDoubleを使う
お金など制度を重要視する情報を扱うならDecimalを使う

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

まとめ

色々書きましたが、数値型って意外と奥が深いです。

ですのでもう一度書きますが、これだけ覚えておいて下さい。

20億くらいの計算ならIntegerを使う
20億以上の数字を扱うならLongを使う
小数点を使うけど、精度は気にしなくていいならDoubleを使う
お金に関する情報を扱うならDecimalを使う

コメント

タイトルとURLをコピーしました