![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
sub test()
Data = 1.03 - 1.001
filepath = "C:\test.txt"
Open filepath For Output As #1
Print #1, Trim(Data)
Close #1
end sub
というsubをVBAで実行します。
すると
2.90000000000001E-02
という値が出力されます。
1.03 - 1.001
は0.029のはずなのに、0.00000000000001E-02 ずれるのはなぜか教えてください。
これを指数ではなく標準形式で出力したいのですが
Print #1, Trim(Format(Data, "#.##"))
の方法だと桁数が分かっている場合には良いのですが
桁数が未知の場合にはどうしたら良いですか?
Print #1, Trim(Format(Data, "#.###############################"))
のようにどんな値が来ても良いように大きめに桁数を取っておくしかないですか?
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
こんにちは。
私は、しばらくVBAも離れていたので、もう一度、復習を兼ねて総ざらえしてみました。
すでに#1様がご説明がありましたが、統計的にみて、小数点演算の約7割ぐらいに、浮動小数点誤差が発生しますので、小数点(時間計算を含む)は、それなりの方策を取らなくてはなりません。これは、VB6のマニュアルには載っているのですが、Excel VBAでは、私自身は、あまり見たことがありません。しかし、表計算の表の部分でも、同じことが起こっています。
概ね、VBプログラミングで教わる方法は、
固定小数点法, 整数変換法 の二点だと思います
固定小数点法というのは、出てきた小数点の数字をそのまま扱うことです。
Currency やCDec などの十進数計算もこの部類に入ります。
計算スピードも速いそうです。
a = 1.03: b = 1.001
mData = CCur(a) - CCur(b)
mData = CDec(a) - CDec(b)
mData = Format(a - b, "0.000") '←?
また、このような固定小数点法もあります。
mData = 1.03@ - 1.001 'リテラルに直接@を付けます。
整数変換法というのは、本来、整数値では誤差がでませんので、10の小数点の桁数を掛けて整数にします。しかし、そのまま、整数にすると間違うこともあるので、丸めます。
mData = (Int(a * 10 ^ 3 + 0.5) - Int(b * 10 ^ 3 + 0.5)) / 10 ^ 3
こんな計算です。Intは、負数の計算には使えませんので、Fix関数を用いることも可能です。
また、VBAには、ワークシート関数以外には、小数点を丸めるためのRound関数がありませんから、
このような方法になります。
http://dobon.net/vb/dotnet/beginner/floatingpoin …
http://support.microsoft.com/kb/214118/ja
No.1
- 回答日時:
こんにちは。
> 1.03 - 1.001
> は0.029のはずなのに、0.00000000000001E-02 ずれるのはなぜか教えてください。
とりあえず、
【浮動小数点数 誤差】
のようなキーワードで検索すると、
たくさんの解説が見つかりますから、みてください。
簡単にいうと、二進数で小数点数を演算する以上は。
十進数との間に丸め誤差に代表される誤差が生じるのは必然です。
対策。
> Data = 1.03 - 1.001
↓
Data = CDec(1.03) - CDec(1.001)
> Print #1, Trim(Data)
↓
Print #1, CStr(Data)
のような対処で、Format()関数は使わなくても、
今回のケースでは、十分かと。
小数点数の演算を十進数として扱えば、
人間にとって普通の計算をして、お望みの答えが返ってきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
O(n log n)について2
-
16進数 加算 減算 C言語
-
VB.net Double と...
-
C言語プログラミングにて、arct...
-
”/”を使わずに割り算したいんで...
-
c languageで 簡単な質問があ...
-
EXCELの関数"STDEV(標準偏差)"...
-
10次の多項式を求めるプログラ...
-
powf を使わずにべき乗を計算
-
浮動小数演算は実行環境の変化...
-
差分積分、数値積分の誤差について
-
全加算回路
-
乱数 なぜ剰余を使うのか
-
有効数字について 以前質問をし...
-
ラズベリーパイ>MM-TXS03で温度...
-
多桁計算
-
ハッシュ関数
-
計算が合わない
-
三菱シーケンサ(Aシリーズ)で...
-
コンピューターは指数関数をど...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
16進数 加算 減算 C言語
-
c languageで 簡単な質問があ...
-
ExcelでPC(パソコン)によって...
-
”/”を使わずに割り算したいんで...
-
有効数字について 以前質問をし...
-
三角比の俯角の計算
-
ExcelのINT関数の計算結果がお...
-
VB.net Double と...
-
floatの有効桁数
-
パソコンで階乗を計算
-
三菱シーケンサ(Aシリーズ)で...
-
除算を使わずに10で割りたい。
-
VB6.0での小数点の扱いについて
-
EXCELの関数"STDEV(標準偏差)"...
-
時刻の比較
-
VBAでの割り算の余りの求め方
-
計算の丸め誤差の解消について
-
C言語プログラミングにて、arct...
-
VBAでミリ秒まで出力する方法
おすすめ情報