重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

VBのRnd関数を使って次のようにフォーム上に値を返させたときに疑問が沸いたのですが。

sub イベント()
Dim Data As Single
Randomize
Data = Rnd()
Text1.Text = Data
Text2.Text = Int(Data * 100)
end sub

この何回かイベントを実行すると例えば
text1  text2
0.367   36
0.782   78
8.591   8
の様に値が返されてきます。

ここで2つ不思議なのが
HELPでRnd関数を調べると、0以上1未満の範囲の値を返します。となっているのに、なぜ8.591の様な値が出てくるのか?
さらに8.591を100かけて小数点以下切り捨てると859になるはずが、なぜ8になるのか?
理由がわかる方教えてください。

A 回答 (4件)

8.591E-02という指数形式の表示になっているのではないでしょうか。


本当の数値は0.08591でちゃんと0~1に入っているはずです。
    • good
    • 0
この回答へのお礼

もっとテキストボックスを広げて・・・ほっほんとだ
そういうことだったのか!指数表示だ!しょうもね~
すんごくはずかし~・・・たったこんだけのことだったのか!ありがとうございました。

お礼日時:2003/05/30 15:15

タイマーコントロールを張って、下のコードをやってみるがヨロシ



Private Sub cmdMondai_Click()
  Dim Data As Double
  Dim strWk  As String
  
  Randomize
  Data = Rnd()
  Text1.Text = Data
  Text2.Text = Round(Data * 100)
  Call hogehoge
End Sub

Private Sub hogehoge()
  Dim strWk  As String
  Dim strCalc As String
  Dim intWk  As Integer
  Dim intピリオド As Integer
  
  If Left(Text1, 1) <> "0" Then
    intWk = InStr(1, Text1, "E-")
    intピリオド = Mid(Text1, intWk + 2)
    strCalc = Replace(Left(Text1, intWk - 1), ".", "")
    strCalc = "0." & String(intピリオド - 1, "0") & strCalc
    
    strWk = "Text1の値が[" & Text1.Text & "]だから、期待値にならない" & vbCrLf & vbCrLf
    strWk = strWk & "[" & Text1.Text & "] という値は、指数を使わずに計算すると、[" & strCalc & "]" & vbCrLf & vbCrLf
    strWk = strWk & "指数のついた計算には気を配る必要がある"
    MsgBox strWk
    Timer1.Enabled = False
  End If
End Sub

Private Sub Form_Load()
  Timer1.Interval = 10
  Timer1.Enabled = True
  
End Sub

Private Sub Timer1_Timer()
  Call cmdMondai_Click
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました。理由がわかりました。
ところでSubプロシージャ名のhogehogeが妙にはまってしまって笑いが止まりません。どうしよう
今度自分で作る時にこの名前使ってしまいそうです。

お礼日時:2003/05/30 15:18

text1の横幅を広げて見ましょう。


隠れていた何かが表示されます。

この回答への補足

広げてみました・・・う~ん分からない・・・
ひょっとして私って「とろい」

補足日時:2003/05/30 13:52
    • good
    • 0

Dataの方をダブルに汁


100倍値を少数第1位で、四捨五入汁

すると、0~1に収まる

この回答への補足

さっそくの解答ありがとうございます。
Private Sub cmdMondai_Click()
Dim Data As Double
Randomize
Data = Rnd()
Text1.Text = Data
Text2.Text = Round(Data * 100)
End Sub
とするということでしょうか?
やってみましたけど以前との変化はありません。

Rnd関数の戻り値は単精度浮動小数点型なのですが、なぜDoubleにするのですか?

0~1に収めたいのではなく、HELPでは0~1となっているのに1以上の戻り値があるのはなぜか、という疑問なんです。

補足日時:2003/05/30 13:38
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!