[リストへもどる]
一括表示

投稿時間:2004/06/24(Thu) 19:07
投稿者名:くま
Eメール:
URL :
タイトル:
整数部の桁数を取得する方法
こんにちは。早速ですが質問させてください。

VB6.0で,入力した数の整数部の桁数を返すルーチンを考えています。
以下のように書いてみたところ,うまくいかない時があります。
#
    Dim d As Double
    
    d = CDbl(Text1.Text)
    Text2.Text = Fix(Log(d) / Log(10#)) + 1

#

dに10のべき乗を代入すると,Fix関数の結果が予想される値より
1だけ小さくなってしまいます。

dに10を代入してウォッチしてみると
Log(d) / Log(10#)
の部分には,ちゃんと1が返っています。

しかし,そのとき
Fix(Log(d) / Log(10#))
の結果がなぜか0になってしまいます。

試しにFIX(1)を実行してみましたが,そのときはちゃんと1が返りました。
この違いはどこから来るのでしょうか?
FIX()に渡す引数はdoubleで大丈夫だと思ったのですが…。
実は
Log(10.0) / Log(10#) < 1.0
だったりするのでしょうか。

原因をご存知でしたらご教授ください。
既出だったらごめんなさい。

投稿時間:2004/06/24(Thu) 19:43
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 整数部の桁数を取得する方法
> VB6.0で,入力した数の整数部の桁数を返すルーチンを考えています。
InStr関数を使って、小数点の位置を調べるようにしてみるとか。


> 以下のように書いてみたところ,うまくいかない時があります。
通貨型(固定小数点型)とは異なり、Double型やSingle型は「浮動小数点型」といって、
そもそも、誤差を含む値なのです。

10進数ですと、10÷3な小数値を正しく表現できませんよね。
それと同様、2進数でも表現しきれない数があるわけです。
(桁数が多ければ誤差は減りますが、桁数を無限にするわけにもいきませんしね)


Private Sub Form_Load()
    Dim A As Double
    Dim B As Double
    Dim X As Double
    A = 32
    B = 1000
    X = Fix((A / B) * B)
    Label1.Caption = CStr(X)

    Dim C As Currency
    Dim D As Currency
    Dim Y As Currency
    C = 32
    D = 1000
    Y = Fix(CCur(C / D) * D)
    Label2.Caption = CStr(Y)
End Sub

投稿時間:2004/06/24(Thu) 21:28
投稿者名:くま
Eメール:
URL :
タイトル:
Re^2: 整数部の桁数を取得する方法
くまです。
魔界の仮面弁士様,早速のお返事ありがとうございます。

教えていただいたとおり,InStr関数を使ったところ解決できました。
ありがとうございます。
整数を対象とする場合は末尾に自分で"."を付ければよいのですね?

対数と除算が含まれるので,桁落ちの可能性を考慮しなくては
ならなかったのですが,ウォッチウィンドウで見て演算結果が
整数だったので,見落としてしまいました。
ウォッチ機能も誤差を丸めて表示しているのに気付きませんでした。

勉強になりました。ありがとうございます。