- ベストアンサー
60進数の四則計算
いつもお世話になります。 煮詰まっております。いい方法をご教授頂けたらと思います。 小数点以上は10進数、小数点以下(2桁まで)を60進数で表す数値があります。 1.30 ↑↑↑ ||-60進数 -区切り -10進数 このように表す数の四則計算をして、足し算は問題なく出来ます。 それ以外を計算する方法がうまくいきません。 一度数を10進に戻して・・・と思ったのですが、繰り上がり等でおかしくなっています。 期待値は 6.30×1.30=9.45 8.00÷2.00=4.00 などです。 よろしくご教授くださいますようお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
'パラ1・パラ2に値 'パラ3は0~3までの値(+-×÷) Function TimeCalc(inSng1 As Single, inSng2 As Single, inMode As Byte) As Single Dim sngCalc As Single Dim strWk As String Dim sngWk1 As Single Dim sngWk2 As Single sngWk1 = Convert10(inSng1) sngWk2 = Convert10(inSng2) Select Case inMode Case 0: sngCalc = sngWk1 + sngWk2 Case 1: sngCalc = sngWk1 - sngWk2 Case 2: sngCalc = (sngWk1 * sngWk2) / 100 Case 3: sngCalc = (sngWk1 / sngWk2) * 100 End Select TimeCalc = (sngCalc \ 100) & "." & Format(((sngCalc Mod 100) * 60 / 100), "00") End Function '一次変換用 Function Convert10(inSng As Single) As Single Dim strWk As String strWk = Right(Format(inSng, "#.#0"), 2) Convert10 = CSng(Int(inSng) & (CSng(strWk) / 60 * 100)) End Function
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
>煮詰まっております--->行き詰まっております。の 間違いでは。 >60進数で表す数値---->60進数ではないでしょう。時間の分などが背景にあるのでしょうが、60進数とは60個の文字を使うはず。 2進数--->0,1の2個 8進数--->0-7の8個。ここらまではアラビア数字 で事足りる。 16進数--->0-9の10個とA-Fの6個の計16文字で表す。A-Fは慣行。 60進数は60文字要るはず。 「時間と分を表す数字(10進数)があります」で良いのでは。(1)文字列の場合と(2)仮に小数点以上+.+小数点以下の2桁(=<0.60)で表す場合、(3)1日を1という値で表すなどがありますが。 回答そのものではないのですみませんが、気になったので 。間違っていたら教えてください。時間・分の加減は私は ヴェクトルの加減に近いと思ってます。 (1,20)+(2,30)=(3,50) 分の要素に時間への繰り上がりがありますが。
お礼
ご回答ありがとうございます。 皆さんのおかげをもちまして解決いたしました。
- a0123456789
- ベストアンサー率22% (57/255)
この数値が時間を示していて(整数部が時間、小数部2桁が分)を示しているのでしたら、全部一度 分に直して(整数部×60+小数部×100)四則演算を行い、 その後、結果を60で割り、余りを100で割った値と商を足せば(商+余り/100)求める答えが出ると思います。 但し、足し算,引き算及び整数の掛け算は全て意味のある数値でしょうが、割り算及び小数を乗数に持ってくる計算に関しては一部意味不明の解となると思いますが...(あくまでもこの数値が時間を表していると仮定した場合、この場合割り算の結果については普通に計算した方が意味のある数値となると思います。)
お礼
ご回答ありがとうございます。 初めはその方法でしていたのですが、除算乗算でうまくいかなくなってしまったのです。(繰り上がりの問題?) 将来的には、十進などと入力値を切り替える事ができるようにしたいので、 今回あえてこのような方法をとっております。
速度が出るかどうかは分かりませんが・・・ 0.s=1.30等の値 1.整数値は、そのままの値として計算するので、floor関数とかで小数点以下を切り捨てる。(とりあえず、xという変数) 2.小数点以下の数字は、s-xで求めることが可能なので、それを10進数に戻してやれば、あとは、単純な足し算でできるのでは、ないでしょうか?((s-x)/60が10進数で少数を表したものになるはず) 間違いがありましたらご指摘ください。 ではでは☆
お礼
ご回答ありがとうございます。 floor関数知りませんでした~(恥ずかしい) 数値をString型にキャスト ↓ Instr関数で小数点を見つける ↓ Left関数で先頭から小数点前までを取得 ↓ 数値型にキャスト なんてしてました。超ムダをしまくりです。
- yotta
- ベストアンサー率32% (26/79)
小数点以下の数値を60で割って10進数の小数点として計算し 計算後小数点以下を60を掛けて60進数に戻す 例では 6.30×1.30=9.45 30÷60=0.5 なので 6.5×1.5=9.75 0.75×60=45 となり答えは 9.45 8.00÷2.00=4.00 は小数点以下がないのでこのままでよい
お礼
ご回答ありがとうございます。 皆さんのおかげをもちまして解決いたしました。
お礼
いつも素早いご回答ありがとうございます。 TAGOSAKU7さんのご回答でうまくいきました。 片側が小数点以下が0の時のみ分岐を追加しました。 (*100しました) 理由: 3.00/1.3 などの時、小数点以下を0としてしまうため。