
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になるのか?
理由がわかる方教えてください。
No.4
- 回答日時:
タイマーコントロールを張って、下のコードをやってみるがヨロシ
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
ありがとうございました。理由がわかりました。
ところでSubプロシージャ名のhogehogeが妙にはまってしまって笑いが止まりません。どうしよう
今度自分で作る時にこの名前使ってしまいそうです。
No.1
- 回答日時:
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以上の戻り値があるのはなぜか、という疑問なんです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロ 特定のセル値のみクリ...
-
先ほどの質問の続きなのですが...
-
【ASP.NET】 DataTextFieldの値...
-
marginとpaddingにマイナス
-
DBのデータをjavascript側で利...
-
PL/SQLでのTO_DATEの時間取得に...
-
パスワードの再入力処理
-
VBScriptで別フレームのセレク...
-
VB.NETで DataRow()を利用して...
-
count(*)で取得した値をJAVAの...
-
VBA ユーザーフォーム ボタンク...
-
PHP8でWarning:Undefined varia...
-
【ACCESS】リレーションを組ん...
-
[Excel VB]プルダウンで文字選...
-
エクセルでエラーを無視して一...
-
Excel VBA 配列の分割について
-
「XML」の読み方
-
利用者側のMACアドレスを取得し...
-
Excel VBAで、 ヘッダーへのセ...
-
Excle VBA Findメソッドについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストボックスのvalueとtext...
-
値を返さないコード パス
-
VB.NETでコンボボックスの1行目...
-
VBA ドロップダウンリストを残...
-
C#の質問です
-
vb6のVSFlexGridで選択行、列の...
-
VB.NETでアクティブなformを知...
-
Excel VBAのリストボックスの値...
-
VB.NETのスクロールバーコント...
-
PL/SQLでのTO_DATEの時間取得に...
-
ユーザーフォームのテキストボ...
-
VBA(自然数)
-
マクロ 特定のセル値のみクリ...
-
マクロで奇数と偶数の値を2か所...
-
ACCESS VBA 画像ファ...
-
変数に代入してある数値を表示...
-
【ASP.NET】 DataTextFieldの値...
-
チェックした値を取得したい(C...
-
変数名の取得
-
windowsアプリケーションで小数...
おすすめ情報