- ベストアンサー
型「double」「decimal」「float」について教えて下さい
- 型「double」「decimal」「float」について教えて下さい。
- VB2010とSQL Server 2008 R2 で開発を行っている初心者です。単価が銭単位の商品の金額計算において、変数の型を「Double」から「Decimal」に変更すると誤差がなくなりました。また、SQL Serverの単価の型も変えた際に格納されている値が整数に変わってしまいました。同じ「Decimal」でもVBとSQL Serverでは利用方法が異なるのでしょうか?
- VBでの「Double」と「Decimal」の使い分けや、SQL Serverでの「float」と「decimal」の使い分けについて教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
◎補足です。 データの受け渡し時に注意すれば、どちらの型に入れても問題ありません。 どーせデータベースとSQL構文でやりとりする時は全て文字列で処理されます。 ですから、計算精度内でしたら、どちらに入れ替えても問題ありません。 注意点は… ・Decimalの方が大きな数値桁数を格納可能です。 ・VBの変数型で一番速度が遅いのがDecimalなので大量計算時には要注意。 こんな所で良いでしょうか?
その他の回答 (3)
- nda23
- ベストアンサー率54% (777/1415)
お金の計算でFloatやDoubleを使うのは御法度です。 これらは2進数の形式で、簡単に言うと、基準点を 0として、これより大きければ+、小さければ-とした 指数表現です。例えば、0.75は 2^(-1) + 2^(-2) つまり、2の-1剰(0.5)と2の-2剰(0.25)の和で表し ます。よって、たいていの10進数の小数部は正確に 表現できません。(2のべき乗の和だけで表現でき、 それが特定桁以内の場合のみ正確になる) このため、演算誤差が生じます。 金額が出てくる場合は通貨型(0.0001を単位とした 整数)または十進型を使います。後者を使うほうが 圧倒的に多いでしょう。通貨型の無いDBもあるから です。VBの十進型は29桁の固定小数点形式です。 即ち、整数による計算になります。但し、四則以外の 計算をすると、浮動小数点形式が介在して計算誤差が 出てきます。 内部形式を理解しないでDB設計するのはマズいですね。 形式変換する前には必ずバックアップを取りましょう。
- takuwanosho
- ベストアンサー率36% (59/163)
VB2010を持っていないので計算精度誤差については良くわかっていませんが他を記載します。 パソコンの計算チップでは小数点を扱う時に浮動小数点を使っていますが、計算中に動的に小数点を浮動させる関係で、小数点計算をした時に計算誤差が出る場合があり、少数2桁以上を使う場合は少し注意が必要です。 昔のプログラマで、この辺が面倒になってくると、全てを整数で計算させておいて最後に必要桁で割るなどとやる事があります。 VBの場合、Doubleは浮動小数点、Decimalは固定小数点、での計算になります。 MSSQLでは、floatは浮動小数点、Decimalは固定小数点、での計算になります。 固定小数点の場合は昔のプログラマが整数で計算させたのと同じ様になるために固定桁数範囲では精度が保証されます。 浮動小数点を使うメリットはメモリ容量だったり速度だったりと言う面になるかと思います。 で、MSSQLで整数点に化けたのは「decimal(18,0)」この設定が原因です。 これは、整数部18桁、少数部0桁、での固定小数点を格納する形と言う意味です。 小数部0桁の固定小数点数値って…要は整数にして格納しろって事です。 もし、整数部18桁、少数部2桁、を保持したければ decimal(18,2) とするべきでした。 変換で失われた数字は戻りませんのでDBの変更は慎重に。
- D-Matsu
- ベストアンサー率45% (1080/2394)
SQL ServerのDecimalについては下記URLを参照。 http://msdn.microsoft.com/ja-jp/library/ms187746.aspx 要は、小数以下を扱いたいのに > decimal(18,0) ではNGってことです。整数18桁小数0桁という指定なので。
お礼
親切なご説明ありがとうございました。 ということは、 VBで、固定小数点であるDecimalで計算した時は SQL Serverの中も固定小数点であるDecimalで格納した方がよい、 ということなんでしょうか。