1

次のコードがあります。

Dim a as Long
a = InputBox("a=")
Dim nr_cifre as Long
nr_cifre = 0
Dim n as Long
n=a
Do While n <> 0
    n=n / 10
    nr_cifre = nr_cifre + 1
Loop
If a - a mod (10 * nr_cifre) = 0.5 Then
    a=a+0.9+(nr_cifre*10)
End If
MsgBox a mod (10 * nr_cifre)

基本的に、数値を切り上げようとします。したがって、2.3 は 2 になります。また、たとえば 2.5 を 3 に切り上げようとします。

この例は、1234.5 のような小さな数値で機能します。しかし、12345,6 を切り上げようとすると、奇妙なエラーが発生します。VB6でもコードを試しましたが、成功しませんでした。

あなたの助け/提案をお願いできますか?どんなヒントでも大歓迎です。前もって感謝します!

4

1 に答える 1

3

独自のアルゴリズムが必要な場合は、これを試してください。

WSH.Echo CustomRound(-123456.7) '-123457
WSH.Echo CustomRound(-123456.5) '-123456
WSH.Echo CustomRound(-123456.3) '-123456
WSH.Echo CustomRound(123456.7)  '123457
WSH.Echo CustomRound(123456.5)  '123457
WSH.Echo CustomRound(123456.3)  '123456

Function CustomRound(nValue)
    CustomRound = Int(nValue + 0.5)
End Function

また...

WSH.Echo CustomRound2(-123456.7) '-123457
WSH.Echo CustomRound2(-123456.5) '-123457
WSH.Echo CustomRound2(-123456.3) '-123456
WSH.Echo CustomRound2(123456.7)  '123457
WSH.Echo CustomRound2(123456.5)  '123457
WSH.Echo CustomRound2(123456.3)  '123456

Function CustomRound2(nValue)
    CustomRound2 = Sgn(nValue) * Int(Abs(nValue) + 0.5)
End Function

うーん...もう1つのアイデア:)

Function RoundFrm(nValue)
    RoundFrm = Null
    If IsEmpty(nValue) Or _
    Not IsNumeric(nValue) Then Exit Function
    RoundFrm = FormatNumber(nValue, 0)
End Function

そして、上記のアイデアを使用すると、次のようなより完全な機能を作成できます...

Function RoundEx(nValue)
    Select Case VarType(nValue)
        Case vbInteger, vbLong
            RoundEx = nValue
        Case vbSingle
            RoundEx = CSng(FormatNumber(nValue, 0))
        Case vbDouble
            RoundEx = CDbl(FormatNumber(nValue, 0))
        Case vbCurrency
            RoundEx = CCur(FormatNumber(nValue, 0))
        Case Else: RoundEx = Null
    End Select
End Function
于 2013-03-15T23:14:34.967 に答える