アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になります。
煮詰まっております。いい方法をご教授頂けたらと思います。

小数点以上は10進数、小数点以下(2桁まで)を60進数で表す数値があります。

1.30
↑↑↑
||-60進数
 -区切り
-10進数


このように表す数の四則計算をして、足し算は問題なく出来ます。

それ以外を計算する方法がうまくいきません。
一度数を10進に戻して・・・と思ったのですが、繰り上がり等でおかしくなっています。

期待値は
6.30×1.30=9.45
8.00÷2.00=4.00
などです。

よろしくご教授くださいますようお願い致します。

A 回答 (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
    • good
    • 0
この回答へのお礼

いつも素早いご回答ありがとうございます。

TAGOSAKU7さんのご回答でうまくいきました。

片側が小数点以下が0の時のみ分岐を追加しました。
(*100しました)

理由:
3.00/1.3
などの時、小数点以下を0としてしまうため。

お礼日時:2002/11/08 10:25

>煮詰まっております--->行き詰まっております。


間違いでは。
>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)
分の要素に時間への繰り上がりがありますが。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
皆さんのおかげをもちまして解決いたしました。

お礼日時:2002/11/08 16:20

この数値が時間を示していて(整数部が時間、小数部2桁が分)を示しているのでしたら、全部一度 分に直して(整数部×60+小数部×100)四則演算を行い、


その後、結果を60で割り、余りを100で割った値と商を足せば(商+余り/100)求める答えが出ると思います。
 但し、足し算,引き算及び整数の掛け算は全て意味のある数値でしょうが、割り算及び小数を乗数に持ってくる計算に関しては一部意味不明の解となると思いますが...(あくまでもこの数値が時間を表していると仮定した場合、この場合割り算の結果については普通に計算した方が意味のある数値となると思います。)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

初めはその方法でしていたのですが、除算乗算でうまくいかなくなってしまったのです。(繰り上がりの問題?)

将来的には、十進などと入力値を切り替える事ができるようにしたいので、
今回あえてこのような方法をとっております。

お礼日時:2002/11/08 09:34

速度が出るかどうかは分かりませんが・・・


0.s=1.30等の値
1.整数値は、そのままの値として計算するので、floor関数とかで小数点以下を切り捨てる。(とりあえず、xという変数)
2.小数点以下の数字は、s-xで求めることが可能なので、それを10進数に戻してやれば、あとは、単純な足し算でできるのでは、ないでしょうか?((s-x)/60が10進数で少数を表したものになるはず)

間違いがありましたらご指摘ください。
ではでは☆
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

floor関数知りませんでした~(恥ずかしい)

数値をString型にキャスト

Instr関数で小数点を見つける

Left関数で先頭から小数点前までを取得

数値型にキャスト

なんてしてました。超ムダをしまくりです。

お礼日時:2002/11/08 16:14

小数点以下の数値を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
は小数点以下がないのでこのままでよい
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
皆さんのおかげをもちまして解決いたしました。

お礼日時:2002/11/08 16:19

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

このQ&Aを見た人はこんなQ&Aも見ています