VBAのdouble型から0.1を引くと桁がおかしくなる理由と解決方法

このQ&Aのポイント
  • エクセルVBAでdouble型の変数に-80を代入し、0.1ずつ引いていくと、途中から桁がおかしくなる現象が起きます。これは、double型の精度の限界によるものです。double型は2進数で数値を表現するため、10進数の小数を完全に表現できません。そのため、少数の計算を繰り返すと、誤差が累積し、桁がおかしくなることがあります。
  • この現象を回避するためには、double型ではなくDecimal型を使用することが推奨されています。Decimal型は10進数で数値を表現するため、小数の計算を正確に行うことができます。また、計算の途中で誤差が累積しないため、桁がおかしくなることもありません。
  • したがって、VBAで小数の計算を正確に行いたい場合は、double型ではなくDecimal型を使用するようにしましょう。Decimal型は数値の精度が高いため、桁がおかしくなる問題を回避することができます。
回答を見る
  • ベストアンサー

VBA "double"から0.1を引くと・・・

エクセルVBAですが、double型で変数を定義し、-80を代入します。 そこから0.1ずつを引いていきます。すると、途中から桁がおかしくなってしまいます。 (注:別に-80からでなくても、どの値からでも、また、引いていっても足していっても、遅かれ早かれ どこかから桁がおかしくなってしまいます。) -80 -80.1 -80.2 …中略 -80.8 -80.8999999999999 -80.9999999999999 … といった感じです。 どうしてこのようになってしまうのでしょうか。 また、このようにならないためにはどうしたらよいのでしょうか。 いかにサンプルプログラムを載せます。 ------------------------------------------ Sub test() Dim test As Double Dim i As Integer test = -80 For i = 1 To 100 test = test - 0.1 Cells(i, 1) = test Next i End Sub ----------------------------------

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

  • ベストアンサー
  • kokorone
  • ベストアンサー率38% (417/1093)
回答No.1

端的に言えば、コンピュータの宿命というか、そういう仕様です。 http://d.hatena.ne.jp/satakesatake/20090522/1242988375 など、「浮動小数点」でネット検索してみてください。 人間では、0.1という数字ですが、コンピュータの内部では0.1ではないのです。 回避方法としては、有効桁数 この場合、小数点以下1位 ですので、本来の値を10倍して、整数として計算して、出力時だけ、計算値を10分の1 のDoubleにしてはいかがでしょうか?

dansin_Goo
質問者

お礼

回答ありがとうございます。 浮動小数点の仕組みなんだろうなあと思っていたら、やはり そうでしたか。 調べてみたら、自己解決しました。 10分の1するのにも、「test*0.1」ではだめで 「test / 10」にすると大丈夫でした。 回答ありがとうございます。

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

浮動小数点型で小数点以下の値を含む場合は基本、誤差を生じます。 ネット検索で「浮動小数点、誤差」で検索すれば詳しい解説が出てきますよ。 対応方法としてはcurrency型やa@のような接尾辞を用いてdecimal型にする(これはかなり古い仕様ですが)あたりでしょうか。

dansin_Goo
質問者

お礼

回答ありがとうございます。 浮動小数点の仕組みなんだろうなあと思っていたら、やはり そうでしたか。 調べてみたら、自己解決しました。 10分の1するのにも、「test*0.1」ではだめで 「test / 10」にすると大丈夫でした。 回答ありがとうございます。

関連するQ&A

  • エクセルVBA:ある有名な方のサイトで・・・

    VBA初心者です。よろしくお願いします。 いま、VBAを勉強しています。 有名なT氏のエクセルVBAに関するサイト(オフィスT・・)の、「高速化テクニック」のところで、下記、★ ★ ★以下のような例がありました。 「Cells(j, 1).Font.FontStyle = "太字"」 が目的の作業であるならば、 「Dim i As Integer」「For i = 1 To 100」を何のために宣言し、記述しているのでしょうか?「j」の変数の宣言は「Cells(j, 1).・・・」で理解できますが、「i」の宣言また、「For i = 1 To 100」は不要のように思われるのです。 最初は何かの間違いかと思っていましたが、同氏の他の解説にも同様の記述がありましたので、きっと、意味があるのですね。教えてください。 ★ ★ ★ Sub Test2() Dim i As Integer, j As Integer For i = 1 To 100 For j = 1 To 10 Cells(j, 1).Font.FontStyle = "太字" Next j Next i End Sub

  • VBAで関数を使うには?

    こんな感じだったとします。   A1      B1 2002/9/2 2002/9/3 2002/9/4 2002/9/5   : このB1にそれぞれの曜日を表示させるVBAを以下のようにしました。 Sub youbi() Dim i As Integer For i = 3 To 10 Cells(i, 3).Value = Weekday(Cells(i, 2), "aaa") Next End Sub もちろんエラーでした。 (メッセージは「型が一致しません」です。) そこで以下のように変更しました。 Sub youbi() Dim i As Integer For i = 3 To 10 Cells(i, 3).Value = "=text(Weekday(b3), ""aaa"")" Next End Sub するときちんと曜日が表示されたのですが、もちろん全部B3のセルの日付の曜日です。 ここを変数にするにはどうしたらいいのでしょうか? とっても簡単なことのように思えますが、意外とハマってしまって抜け出せません。 よろしくお願いします。

  • VBAで実行時エラー'13': がでます

    初歩の初歩ですいません。 VBAで Dim A As Integer Dim B As Integer Dim C As Integer Dim gokei As Integer For i = 8 To 70 A = Cells(i, 4).Value B = Cells(i, 5).Value C = Cells(i, 6).Value goukei = A + B + C Cells(i, 7) = goukei Next i としていますが A = Cells(i, 4).Value のところで今使っているシートだと止まってしまいます。 新規でワークシートを使って仮に数字を代入すると普通に動きます。 今使っているシートもセル内には =100 と入力して 100 と表示され セルの書式設定も数値になってるんですがどうしてでしょうか?

  • VBAで

    VBAで Sub test() '日付から曜日を取得 WEEKDAY(A2) Dim i As Integer For i = 3 To 20 Cells(i, 2) = Weekday(Cells(i, 1)) Next End Sub 横のセルを参照する場合は、上記のようになると思いますが、上のセルを参照するにはどのようにすればいいでしょうか? 例えばA1~T1セルを参照して、A2~T2に反映させると言った具合です。よろしくお願いします。

  • VBAの得意な方、教えてください(初心者です)

    エクセルのシートが セルA1に1 セルA2に2 セルA3に3 セルA4に4 セルA5に5 という数字が入っています。 で、セルD4には"=D2*5"という数式が入っています。 セルD2にA1の数値を代入して、出てきた数値をB1に入力、 次にD2にA2の数値を代入して、出てきた数値をB2に入力…以下続く というのをVBAで書いてみたら、下のような感じになりました。 Sub test() Dim d1 As Integer Dim d2 As Integer Dim d3 As Integer Dim d4 As Integer Dim d5 As Integer Dim p1 As Integer Dim p2 As Integer Dim p3 As Integer Dim p4 As Integer Dim p5 As Integer d1 = Cells(1, 1).Value Cells(2, 4).Value = d1 p1 = Cells(4, 4).Value Cells(1, 2).Value = p1 d2 = Cells(2, 1).Value Cells(2, 4).Value = d2 p2 = Cells(4, 4).Value Cells(2, 2).Value = p2 d3 = Cells(3, 1).Value Cells(2, 4).Value = d3 p3 = Cells(4, 4).Value Cells(3, 2).Value = p3 d4 = Cells(4, 1).Value Cells(2, 4).Value = d4 p4 = Cells(4, 4).Value Cells(4, 2).Value = p4 d5 = Cells(5, 1).Value Cells(2, 4).Value = d5 p5 = Cells(4, 4).Value Cells(5, 2).Value = p5 End Sub ここで質問です。 例では5個しかないのですが、実際は100行くらいのデータなんで 大変です。もっと簡単にする方法はありますか? 実際のセルD4の数式は、他からも参照したりしているので、 ここはいじらずに教えてください。 Excel2000、Visual Basic 6.0 ってのを使っています。 よろしくお願いいたします。

  • VBAのUserFormでサブルーチンを用いる

    UserFormのコードに次のように書いてbuttomを押してみると コンパイルエラー:ByRef引数の型が一致しません。 と出てしまいます。 どこが間違っているのでしょうか?ご回答お願いします。 Private Sub buttom_Click() Dim i As Integer Dim name As String i = 1 name = "名前" Call test(i , name) End Sub ---------------------------------------------- Sub test(i As Integer, name As String) Cells(i , 1) = name End Sub

  • エクセル2019 VBAについて

    エクセル2019でVBAを使いコピーペーストの勉強中です、次の箇所(Dim i As integr)で、ユーザー定義型は定義されていませんと指摘されて止まってしまします、Sheet("データ")には3行のデータは入っています、VBA初心者のため、この後が、なかなか前に進めません、どうかよろしくおねがいします。 ********************************** Sub 練習() Dim s1 As Worksheet: Set s1 = Worksheets("請求書") Dim s2 As Worksheet: Set s2 = Worksheets("データ") Dim r1 As Integer: r1 = 18 Dim r2 As Integer: r2 = 2 { Dim i As integr } For i = 0 To 2 s1.Range(s1.Cells(r1 + i, 1), s1.Cells(r1 + i, 3)).Value = s2.Range(s2.Cells(r2 + i, 2), s2.Cells(r2 + i, 4)).Value s1.Cells(r1 + i, 4).Value = s1.sells(r1 + i, 2).Value * s1.Cells(r1 + i, 3).Value Next End Sub ***************************************

  • EXCEL VBA

    EXCEL VBAで空白行が現れたら「小計」の文字を入力したいと思い以下のように記述しましたが、うまくいきません。どこがおかしいのか教えてください。 宜しくお願いします。 Sub write小計() Dim i As Integer Dim rowcnt As Integer rowcnt = Cells(1, 1).CurrentRegion.Rows.Count Range("B1").Select For i = 1 To rowcnt If Cells(i, 2).Value = "" Then Value = "小 計" ActiveCell.Offset(1).Select Next i End Sub

  • 配列

    エクセルvbaなのですが Sub test() ' 配列 Dim arr() As Integer= {0, 1, 2, 3, 4, 5} ' 抜き出した要素を格納するための変数 Dim i As Integer ' すべての要素について繰り返す For Each i In arr Console.WriteLine (i) Next End Sub これって何でエラーになるのでしょう? Dim arr() As Integer= {0, 1, 2, 3, 4, 5} でエラーになりますが、なぜだかわかりません。

  • エクセルでくんだVBAマクロが途中でとまるのですが、

    エクセルでくんだVBAマクロが途中でとまるのですが、 どこがおかしいかご指摘して頂けませんでしょうか? 以下のプログラムは セル(19.6)にxの値を代入し、 E24にそれに対応したyを出力させるプログラムです。 あと余談となりますが、 繰り返し構文は同時に複数の変数はできないのでしょうか? 例えば以下のものは変数iをステップ0.1で加算していますが それに対応して表示させるセルを一つずつずらすために 変数kを指定してfor構文を連立させようとしたのですが うまくいきませんでした。 Sub k() Dim i As Double For i = 0 To 10 Step 0.1 Cells(22 + 10 * i, 7).Value = i Cells(19, 6).Value = i Range("H" & 10 * i + 22).Value = Range("E24").Value Next i End Sub

専門家に質問してみよう