[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『小数点以下の数字が増えてしまいます』(コヨーテひな)
数字が勝手に増えてしまいます。
今までは、円単位の値に関して、千円単位に変換していました。
A1に934077の数字を入れ、以下を行います。
Dim x As Integer
x = Round(Range("A1") / 1000)
Range("B1") = x
B1には、934が入ります。
その後、円単位でも数字が知りたいことになりましたので、変数宣言で
IntegerをSingleに変更しました。
Dim x As Single
x = Round(Range("A1") / 1000,4)
Range("B1") = x
見た目はB1には、934が入ります。
しかし、カーソルを当ててみますと、934.077026367187となっています。
変数宣言で、SingleをDoubleにしますと
Dim x As Double
x = Round(Range("A1") / 1000,4)
Range("B1") = x
見た目はB1には、934が入ります。
カーソルを当ててみますと、934.077となります。
Doubleで求めた結果が知りたかったのですが、Singleで小数点以下の
数字が増えてしまうのは、なぜだかお解かりになられる方教えてください。
< 使用 Excel:Excel2007、使用 OS:Windows7 >
A1 は直接数字の 934077 が入力されているでしょうか。 それとも計算式があって、計算した結果なのでしょうか。
計算結果だとしたら、式と式で使われている値を確認できるでしょうか。
(Mook) 2015/04/13(月) 12:04
A1は円単位で、そのままの数字が入っています。計算式はありません。
(コヨーテひな) 2015/04/13(月) 12:51
変数ではなくてセルの値がということだったでしょうか。 勘違いしていました。
単精度だとセルの精度(15桁)の精度に足りないので、誤差がそのまま表示された だと思います。 倍精度でも誤差は存在しますが、セルより精度が高いので、誤差が顕現しません。 https://msdn.microsoft.com/ja-jp/library/xay7978z.aspx 単精度浮動小数点型 (Single) https://msdn.microsoft.com/ja-jp/library/x99xtshc.aspx 倍精度浮動小数点数型 (Double)
1000 で割るということは、割り切れそうに思えますが、2進法では無限小数になります ので、誤差が発生します。 割る数が2のべき乗であれば、誤差は出ないと思います。
(Mook) 2015/04/13(月) 12:54
ご回答ありがとうございます。
何か見てはいけないような世界の話のようです。
今のところはこの辺で踏む込まず見守ることにします。
もう少し、勉強して理解できるように頑張ります。
(コヨーテひな) 2015/04/13(月) 13:07
小数点はFormatでも指定した方がいいのでしょうか
むりやりsingle型でも出さない方法は
Range("B1").Value = CDec(x)
となりました。
(デイト) 2015/04/13(月) 13:19
時間のあるときに一度どんなデータ型があるか、目を通しておくと良いかもしれません。 https://msdn.microsoft.com/ja-jp/library/xtba3z33.aspx 10 進型 (Decimal) (Visual Basic)
「多くの桁数を必要とし、丸め誤差が許容されない財務計算などに適しています。」 というような説明がありますが、また 「 Decimal は、すべての数値型の中で最もパフォーマンスの低いデータ型です。 」 との説明もあります。
数十程度の計算では問題になりませんが、計算速度と精度はトレードオフということを 認識しておくと良いかと思います。 どちらを使うのが良いかは、ケースバイケースですね。
蛇足ですが、先ほど、 > 割る数が2のべき乗であれば、誤差は出ないと思います。 と書きましたが、これも数値の精度の程度問題で、「数値の範囲が15桁で収まる限りは」 という条件が付きます。
(Mook) 2015/04/13(月) 14:03
上のリンクなども見てもっといろいろなデータで検証します。
そもそも最もパフォーマンスが低いがどういう意味なのかも言葉ではなく実際に確かめてみます。
ありがとうございました。
(デイト) 2015/04/13(月) 14:14
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.