Page 561 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼訂正&謝罪&さらに質問 [名前なし] 04/3/16(火) 0:26 ┗Re:訂正&謝罪&さらに質問 こうちゃん 04/3/16(火) 9:08 ┗Re:訂正&謝罪&さらに質問 長島監督ガンバ!! 04/3/21(日) 0:01 ─────────────────────────────────────── ■題名 : 訂正&謝罪&さらに質問 ■名前 : [名前なし] <t1312865@hotmail.com> ■日付 : 04/3/16(火) 0:26 -------------------------------------------------------------------------
1.謝罪 すみません。こうちゃんさんていうのは、この掲示板を見た、自分と同じほかの参加者だと思っていました。すみません。 2.訂正それと、Lenは、少数値を文字型に変換した場合、小数点も文字列に数えてしまいます。この間のメールの感想はかなり勘違いしてしまいました。 3.質問 この式を、言葉のコメントありで解説して欲しかったのです。この数式は、競馬の賞金が400万円〜12000万円くらいなので成り立つのですが、少数のときに式が成り立たないようです(cが0.000999とかの場合、0)。友人に聞いたら、log数値/log10 でやってみたらと言われましたが、Round(数値,-1以下数値)の−数値だと成り立ちません。ですので、更なるコメントの解説をお願いします。 |
[名前なし](広島さん?)さん、こんにちは みなさんこんにちは、このスレは、[#2357]の続きってことです。 >1.謝罪 >すみません。こうちゃんさんていうのは、この掲示板を見た、自分と同じほかの参加者だと思っていました。すみません。 私も1参加者ですよ(^^;) 掲示板の書き込みは、質問者と回答者だけでなく、他のかたも見ている場合があり、みんなで情報共有したいと思いますので、掲示板への書き込みをお願いした次第です。 >2.訂正それと、Lenは、少数値を文字型に変換した場合、小数点も文字列に数えてしまいます。この間のメールの感想はかなり勘違いしてしまいました。 はい。 >3.質問 >この式を、言葉のコメントありで解説して欲しかったのです。この数式は、競馬の賞金が400万円〜12000万円くらいなので成り立つのですが、少数のときに式が成り立たないようです(cが0.000999とかの場合、0)。友人に聞いたら、log数値/log10 でやってみたらと言われましたが、Round(数値,-1以下数値)の−数値だと成り立ちません。ですので、更なるコメントの解説をお願いします。 > 以下引用------------------------------------------------------------ 別スレ見るのはわずらわしい方もおられると思いますので、再掲しときますね。 競馬のデータを組んでいるものなのですが、賞金を計算するのに関数を使用するのですが 賞金 1着=賞金*1倍 2着=賞金*0.4倍 3着=賞金*0.25倍 4着=賞金*0.15倍 5着=賞金*0.1倍 と、計算するのですが、この数値を左から3桁目を四捨五入しなければなりません。 競馬新聞を見れば分かると思いますが、何かうまい方法はないでしょうか。 よろしくお願いします。 (例)単位:=万 1着=3800 2着=1500 3着=950 4着=570 5着=380 Sub test() MsgBox DIG2(22222, 1.5) End Sub Function DIG2(A As Double, B As Double) As Long Dim C As Double C = A * B DIG2 = Round(C * 10 ^ ((Len(CStr(Int(C))) - 2) * -1)) _ * 10 ^ (Len(CStr(Int(C))) - 2) End Function ここまで------------------------------------------------------------ 競馬の賞金で0.000099って??? 競馬の配当で1円未満の場合は0円になるんじゃないんですか? 広島さんのおっしゃるとおり、提示した計算式は0円以上でないと成り立ちませんね。 んで、少数のときはどう表示すればいいんでしょうか? ま、とりあえず解説・・(詳細はHELPを確認してくださいね) Int(C) ここで少数以下を切り捨てます。ゆえに少数ではなりたちません。 CStr(Int(C)) ここで文字列に変換します。 Len(CStr(Int(C))) 文字数(桁)を数えます。 ((Len(CStr(Int(C))) - 2) 2桁を超える桁数を算出します。 EX:5123だと2、123456789だと7 ((Len(CStr(Int(C))) - 2) * -1)) その桁数をマイナスの変換 Round(C * 10 ^ ((Len(CStr(Int(C))) - 2) * -1))) で10のマイナス乗で2桁の少数にして四捨五入 EX:5123だと51.23を四捨五入51.00 123456789だと12.3456789を四捨五入=12.00 であとは同じ10の桁数乗を掛けてもとの桁に戻す。 といったとこですね。 お友達の言った、log数値/log10 とまあ、おなじことですね。 解読しやすいようにベタな計算式にしたのですが・・ 少数も対応が必要なら、条件を提示してくださいね。 |
こんばんは。こうちゃんさん。こんな感じになりました。 Public Sub 数値四捨五入() Dim 元賞金 As Double Dim 賞金 As Long 元賞金 = InputBox("400以上の整数値を入力してください", "数値入力", "0") If Not IsNumeric(元賞金) Or (元賞金) < 400 Then MsgBox "400以上の数値を数字を入力してください", vbCritical Exit Su Else 賞金 = (Round(元賞金 * 10 ^ (Int(Log(元賞金) / Log(10) - 1) * -1))) * 10 ^ (Int(Log(元賞金) / Log(10) - 1)) MsgBox 賞金 End If ●log(元賞金)/log(10)+1 =>桁数を、小数点まで算出します。(元賞金の桁数は、10の階乗の+1です)。 ●Int((log(元賞金)/log(10)-1)*-1) =>桁数シフトさせるための数値をここで出します。 ●Round(Int((log(元賞金)/log(10)-1)*-1)) =>シフトさせた数値を2桁の整数として四捨五入します。 ●賞金 = (Round(元賞金 * 10 ^ (Int(Log(元賞金) / Log(10) - 1) * -1))) * 10 ^ (Int(Log(元賞金) / Log(10) - 1)) =>上記数値を、シフトした桁数分元に戻して、賞金に代入し、メッセージで出します。 といった感じです。0.4倍〜0.1倍は後から代入する形をとればよいと思います。 こうちゃんさんの式が大変役にたつヒントとなりました。ありがとうございます。Ifをはずせば、負数でも絶対値1以下の少数値でも算出できます。これより前に自分で出した式だとかなり遠回りになってしまうので助かりました。少数を文章で載せなかったのは謝罪します。2チャンネルでは荒っぽい言葉ばかりなのでこちらを当分使用させていただきます。今回はありがとうございました。 |