• ベストアンサー

VB.net Double と Decimal の違い?

VB.NETで開発しています 元々はC言語で開発してましたが、最近VB.NETをしています で、以前誰かが作ったプログラムをデバッグしているんですが、その中に Double や Decimal が混じっています どちらも 浮動小数点 と思うんですが 違いがいまいちわかりません 混じらせる利点ってないと思うんですが、どうなんでしょう? 有効桁数が違うとかだけだったら 簡単なんですが・・

  • kidx
  • お礼率49% (101/204)

質問者が選んだベストアンサー

  • ベストアンサー
  • s-uzen
  • ベストアンサー率65% (2051/3118)
回答No.4

Doubleは俗に言う倍精度浮動小数点数と同じです。 精度重視したのか、Longより大きい値を表現できることを意識したのか、10進数型(Decimal)を使った理由(作者の意図)はこちらも良くわかりません。 Decimalを含むデータ型の説明は下記にあります。 データ型をクリックで詳細説明を参照できます。 http://msdn.microsoft.com/ja-jp/library/47zceaw7.aspx  

その他の回答 (3)

  • Gab_km
  • ベストアンサー率40% (20/50)
回答No.2

なぜDoubleとDecimalが混じっているかは、処理を見てみないと分かりません。 ただ、 ・Doubleは8バイトであるのに対し、Decimalは16バイトで数値を表す ・Doubleは2進数の小数で数値を表すのに対し、Decimalは整数値と小数点位置の組み合わせで数値を表す ・小数の計算はDouble型が高速 など、違いがあります。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

Decimalの精度は28桁で精度が高いですが、範囲が狭い(最大値は7.9 × 10の28乗)です。 なお、小数点以下何桁まで正しいかは絶対値に寄って変わります。 また、10進数で表現できる数値は(精度の範囲内なら)誤差なく表せます。 (あらゆる誤差がないわけではありません。) Decimalの演算パフォーマンスは悪いので、数値計算などには向きません。 10進数を誤差なく表現したい場合(財務計算とか)に使いましょう。 http://msdn.microsoft.com/ja-jp/library/xtba3z33(VS.80).aspx Decimalは基数が10の浮動小数点数ですが、 MSDNでは便宜のためか浮動小数点数型とは別扱いしてますね。

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

Decimalは小数点以下4桁で浮動小数点の誤差無く正しく計算します。 Doubleは普通に浮動小数点です。cのdoubleと同じ。

関連するQ&A

  • 型「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」の使い分け、 について教えて下さい。 よろしくお願いします。

  • DECIMALの範囲について

    例えば、以下のページ www.javadrive.jp/mysql/datatype/index1.html などを見ると @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ M:最大表示サイズを表す。正式な最大表示サイズは 255。 D:小数点型に適用され、小数点以下の桁数を表す。最大値は 30 だが、M-2 より大きくしないようにする。 アンパック浮動小数点数。CHAR カラムのように動作する。``アンパック'' とは、その数値が、各桁に 1 文字ずつ使用して文字列として格納されることを意味する。M では、小数点と、負数に使用される '-' 記号はカウントされない(しかし、これらのためのスペースは確保される)。D が 0 の場合、値は小数点も小数部も持たない。DECIMAL 値の最大範囲は、DOUBLE と同じだが、個々の DECIMAL カラムの実際の範囲は、M と D の値によって制限される。UNSIGNED を指定した場合、負数は使用できない。 D を省略した場合、デフォルトは 0。M を省略した場合、デフォルトは 10 MySQL バージョン 3.23 より前のバージョンでは、M 引数に、符号と小数点に必要なスペースを含める必要がある @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ と解説されていますが、読解力が無いため今イチ理解を得ません(^^; どなたか解説頂けませんでしょうか?

    • ベストアンサー
    • MySQL
  • 『浮動小数点』について

    最近、ふと『浮動小数点』について疑問を持ちました。 それは『浮動小数点』がどんな場合に役立つのか?という事です。 C言語では標準で『float』型と『double』型がありますよね。 私は昔、C言語を始めたころにテスト・プログラムなどで使った経験しかなく その後に『電卓ソフト』を作ろうとしたときに『誤差』が原因で役に立たない ことを知りました。『誤差』があることは知っていましたが…。 そこで質問。内容は『浮動小数点』はどんな場面で利用されているかです。 実際の『ソフトウェア開発』や趣味でフリーソフトを作った場合も含み、あと こんな場面で役に立つのではという事を知りたいのです。 アンケートみたいになりますが、『アンケート』カテゴリでは、あまり回答などが 集まらないと思い『C/C++』カテゴリのこちらで質問としました。 よろしくお願いします。

  • C#のdecimal型について

    C#のdecimal型について C#のdecima;型の変数に色々な値を代入して,バイナリファイルに出力する。 バイナリ出力ファイルを16進ダンプする。 これらのデータを観ると 16バイト目:符号(00:プラス、80:マイナス) 15バイト目:小数点以下の桁数 1~12バイト目:整数を逆転表示 f3 e0 01 00 00 00 00 00 00 00 00 00 00 00 03 00 123.123 123123 = x'01e0f3' なので逆転したf3 e0 01 となる とわかる。  ところで質問ですが、13、14バイト目のデータは何に使用しているのでしょうか。 わかっている方がおりましたら、教えて下さい。

  • VB.NETとC#の違い

    JOBで使用する開発言語をVB.NETにするかC#にするかで迷っています。 画面アプリと裏タスクという構成ですが、 今までは画面=VB、裏タスク=Cという固定概念でしたが、このままでよいのか疑問です。 下記は私なりに調べてみた比較なのですが、 ●従来Cの短所とされてきたこと ・画面設計のし易さ  C#はVBと同じようにVisualStudio上で簡単に設計できる。イベントドリブンも可能。 ・言語のとっつき易さ C#でASPを組んだ経験もありますので大して抵抗はありません。                しかも、VB6.0→VB.NETの移行は従来のVB5.0→6.0へ移行ほど安易ではない。 ●従来Cの長所とされてきたこと ・処理速度     VB.NETと差が無いような記事も見たことがあります。 こう考えるとC#とVBの差が、どんどん縮んできており、長所短所を見出すことができません。 いったい違いって何でしょうか、ご存知の方、ご教示いただきたくお願いいたします。

  • VB6.0 と、 VB.NETについて。

    こんにちは。 VB6.0の、次のバージョンがVB.NETなんでしょうか? VB C C++など各言語にNET版が出ているようですが、 分岐するような感じで、新しく開発言語が増えたと言うことなのでしょうか? パッケージの裏を読んだり、入門書を立ち読みしてもいまいちよくわかりません。 各言語をひとつのパッケージにして売っているようなものがあります。 逆に、次のバージョンで名前を変えて各言語が統合されるのでしょうか? VB.NETを中心に、NETの位置付け・機能について教えてください。 (私はプログラマではありません。ゴメンナサイ) (^_^;)

  • なぜ、VBよりC#を勧めるのですか?

    プログラミング初心者やBASIC経験者に対して、C#を勧める人が結構いるみたいです。 C#よりVB2005を勧めるといった人はほとんど見かけません。 BASIC系の言語を知っていればVBScriptやVBAなどの理解も早いと思いますし、VB.NET(2005含む)の方が参考書や参考Webページが多いように思われます(初心者向けの物は特に多いのでは…) VB6の頃はオブジェクト指向の機能が不完全でしたが、VB.NETになってからは、完全なオブジェクト指向言語となったように聞いていますが… C#の方が洗練されているとか美しいとかいった事を聞きますが、その程度の事は所詮好みの問題ではないでしょうか 生産性や開発コスト、プログラムの管理といった具体的な観点でC#を勧める理由が知りたいです。

  • データ型について

    VBに限ったことではないのですが、 データ型には、短整数型、整数型、長整数型、単精度浮動小数点数型、倍精度浮動小数点数型といろいろな型がありますが、 整数を扱うなら長整数型、小数も含めて扱うなら倍精度浮動小数点数型 を使えば良いと思うのですが、それにより桁数の小さな短整数型、整数型とかは何のためにあるのでしょうか? あまり大きな値を扱わないときにそちらの型を選ぶメリットは何なのでしょうか?

  • C++でのdouble型データの精度

    こんにちは。 コンパイラは、Borland C++ Compiler 5.5 を使っています。 表題の「精度」とは、 正確な値が保証される、「整数部分の桁数」+「小数点以下の桁数」 の事です。 普通、double型データの「精度」は、16桁であると認識しています。 そのため、例えば、 a=123456789012345.6 という浮動小数点数は16桁なので、正しい値が保証されるはずです。 ところが、printf("%f", d1); のようにprintf関数で表示すると、 123456789012345.593800 と表示されました。 これは、d1が正しい値を保持できていないという事です そこで、桁数を下げていった所、 a=1234567890.1 つまり、精度は11桁しかないという事になります。 何か僕が勘違いしているのでしょうか? それとも、僕が使っているコンパイラの精度が11桁しかないという事なのでしょうか? 何かお分かりの方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

  • VBAで呼び出したVBのDLLのデバッグ方法

    VB2010で、COM相互運用機能を使って作成したDLLを VBAから呼び出すことはできるのですが この状態でこのDLLをデバッグすることはできないでしょうか。 本来ならば、DLLをデバッグするテストプログラムを VB2010のVB.NETのWindowsフォームアプリケーションか ConsoleApplication1で作成して、 同じソリューションの中に DLLとテストプログラムのプロジェクトを配置して 参照の追加でDLLを参照設定して 両者をデバッグをすると思われますが、 テストプログラムを作るのがかなり大変なのと、 今回作成したDLLは、元々はVBAの中のひとつのプロシージャ―で、 事情があって、このプロシージャ―だけをVBのDLLにしたものです。 このプロシージャ―は元々はVBAの中で正しく動作していたものです。 VBに書き直した時に何らかの不具合が起きていると思われます。 テストプログラムを作らずに、既存のVBAから呼び出して、 DLLの部分の動作だけを(できればVB2010で)デバッグできないでしょうか。 よろしくお願いします。 (WindowsXP SP3 , Excel2003のVBA , Visual Studio 2010)