型「double」「decimal」「float」について教えて下さい
型「double」「decimal」「float」について教えて下さい。
VB2010とSQL Server 2008 R2 で開発を行っている初心者です。
単価が銭単位(例えば0.01円=1銭)の商品の金額計算を
するとき、最初に変数を「Double」を使って、最後に小数点以下
のまるめ処理を行っていたところおかしな金額計算されてしまい
ました。
具体的には、
Dim intSuryo As Integer
Dim dblTanka As Double
Dim dblKingaku As Double
Dim marumeKingaku As Double
If tbSuryoArray(i).Text <> Nothing Then
If tbTankaArray(i).Text <> Nothing Then
dblKingaku = 0
dblKingaku = intSuryo * dblTanka
Select Case intMarumeKubun
Case 1 : marumeKingaku = Math.Truncate(dblKingaku) '切り捨て
Case 2 : marumeKingaku = Math.Round(dblKingaku, 0, MidpointRounding.AwayFromZero) '四捨五入
Case 3 : marumeKingaku = Math.Ceiling(dblKingaku) '切り上げ
End Select
のコードを書いて計算すると、(単価)4.31×(数量)5000 の計算が、
本来「21550」にならなければいけないのに「21549」になってしまいます。
いろいろ調べてみた結果、変数の型を「Double」にするのがいけなくて、
「Decimal」にすると誤差がなくなるということで、変数をすべて「Decimal」
に直したところ、誤差の現象がでなくなったので問題は解決しました。
問題がもうひとつおきました。
データベースの単価の型も変える必要があるかと思い、
SQL Server内のテーブルの単価のカラムを「float」から「decimal(18,0)」に
変えたところ、既に格納されている値がすべて整数に変わってしまいました。
何やらわけがわからず戸惑っていますが、同じ「Decimal」でもVBとSQL Server
では利用方法が異なるのでしょうか?
またVBでの「Double」と「Decimal」の使い分け、
SQL Serverでの「float」と「decimal」の使い分け、
について教えて下さい。
よろしくお願いします。
お礼
なるほど。 そうだったんですか! URL先、参考にさせていただきます。 ありがとうございました。