はじめまして。
初心者です。
VB6.0において、剰余を求めるMOD関数は浮動少数に対応していないのですが、
これらを実現するのに何かいい方法はございますでしょうか?
ランタイムにあるfmodのような関数が理想ですが。
現在はVB6.0で
Public Function fmod(src1 As Double, src2 As Double) As Double
fmod = (src1 * 10) Mod (src2 * 10)
End Function
としています。
これは、少数1桁のみ対応ですが、2桁となると値をまるめてしまいます。
どなたかいい方法があればご教授願います。
適当ですが、こんなのはどうなんでしょうか。
Public Function fmod(a As Double, b As Double) As Double
fmod = a - Int(a / b) * b
End Function
書き込みありがとうございます。
早速試してみたのですが、うまくいきませんでした。
というのは たとえば 入力値が 0.1単位であるかとか 0.5単位か判断したい
わけですが、以下のような判断文ですとうまくいきませんでした。
おそらくまるめ誤差が発生しているものと思います。
Private Sub Command1_Click()
Dim a As Double
Dim b As Double
Dim c As Double
a = 1.2
b = 0.1
c = fmod2(a, b)
If c = 0 Then
Call MsgBox("OK : " & c)
Else
Call MsgBox("NG : " & c)
End If
End Sub
Public Function fmod(a As Double, b As Double) As Double
fmod = a - Int(a / b) * b
End Function
どうしたものでしょうか。
初心者で申し訳ありません。
通貨型 (Currency)でやってみてはどうですか?
Public Function fmod2(ByVal a As Currency, ByVal b As Currency) As Currency
fmod2 = a - Int(a / b) * b
End Function
浮動小数点型を扱う限りは誤差はつき物です。
どの程度の精度が必要なのかはわかりませんが、
浮動小数点型を使う必要がないのであれば、使わないほうがよいです。
okuさんの書かれておられるとおり、通貨型などの固定小数点のデータ型を使用したほうがよいです。
oku様、書き込み有難うございます。
通貨型で問題なく解決できました。
今回はまことに有難うございました。m(__)m
Private Sub Command1_Click()
Dim a As Double
Dim b As Double
Dim c As Double
a = 1.2
b = 0.1
c = fmod2(a, b)
If c = 0 Then
Call MsgBox("OK : " & c)
Else
Call MsgBox("NG : " & c)
End If
End Sub
Public Function fmod2(ByVal a As Currency, ByVal b As Currency) As Currency
fmod2 = a - Int(a / b) * b
End Function
うにぃ様
アドバイスありがとうございます。
今回は、入力値に対して、単位入力をチェックするためだけですので通貨型で
問題ないと思われます。ありがとうございました。
ツイート | ![]() |