Ich habe folgende Daten:
cell(1,1) = 2878.75
cell(1,2) = $31.10
cell(2,1) = $89,529.13
Wenn ich jedoch versuchte, round(cells(1,1).value*cells(1,2).value),2)
zu verwenden, stimmt das Ergebnis nicht mit cell(2,1)
überein. Ich dachte mir, es hat mit dem Rundungsproblem zu tun, aber ich frage mich nur, ob es möglich ist, round()
normal zu handeln. Das heißt, für value > 0.5
aufrunden. Und für value < 0.5
abrunden?
VBA verwendet Banker-Rundung in einem Versuch, die Tendenz zu kompensieren, immer auf- oder abgerundet zu werden .5; Sie können stattdessen;
WorksheetFunction.Round(cells(1,1).value * cells(1,2).value, 2)
Versuchen Sie es mit dieser Funktion, es ist in Ordnung, ein Doppel aufzurunden
'---------------Start -------------
Function Round_Up(ByVal d As Double) As Integer
Dim result As Integer
result = Math.Round(d)
If result >= d Then
Round_Up = result
Else
Round_Up = result + 1
End If
End Function
'-----------------End----------------
Wenn Sie aufrunden möchten, verwenden Sie die halbe Einstellung. Addieren Sie 0,5 zur Zahl, die aufgerundet werden soll, und verwenden Sie die Funktion INT ().
antwort = INT (x + 0,5)
Ich führe zwei benutzerdefinierte Bibliotheksfunktionen ein, die in vba verwendet werden sollen. Sie dienen dazu, den doppelten Wert zu runden, anstatt WorkSheetFunction.RoundDown und WorkSheetFunction.RoundUp zu verwenden
Function RDown(Amount As Double, digits As Integer) As Double
RDown = Int((Amount + (1 / (10 ^ (digits + 1)))) * (10 ^ digits)) / (10 ^ digits)
End Function
Function RUp(Amount As Double, digits As Integer) As Double
RUp = RDown(Amount + (5 / (10 ^ (digits + 1))), digits)
End Function
Die Funktion Rdown (2878.75 * 31.1,2) gibt also 899529.12 zurück. Und die Funktion RUp (2878.75 * 31.1,2) gibt 899529.13 .__ zurück. Die Funktion Rdown (2878.75 * 31.1, -3) gibt 89000 zurück und Funktion RUp (2878.75 * 31.1, -3) geben 90000 zurück
Ich hatte ein Problem, bei dem ich nur aufrunden musste und diese Antworten funktionierten nicht, da ich meinen Code ausführen musste, also verwendete ich eine andere Methode .. Die INT-Funktion rundet sich in Richtung negativ (4.2 geht auf 4, -4.2 geht) zu -5) Daher änderte ich meine Funktion in negativ, wendete die INT-Funktion an und gab sie dann einfach auf positiv zurück, indem ich sie vor und nachher mit -1 multiplizierte
Count = -1 * (int(-1 * x))
Versuchen Sie die RoundUp-Funktion:
Dim i As Double
i = Application.WorksheetFunction.RoundUp(Cells(1, 1).Value * Cells(1, 2).Value, 2)
Dies ist ein Beispiel. J ist der Wert, den Sie aufrunden möchten.
Dim i As Integer
Dim ii, j As Double
j = 27.11
i = (j) ' i is an integer and truncates the decimal
ii = (j) ' ii retains the decimal
If ii - i > 0 Then i = i + 1
Wenn der Rest größer als 0 ist, wird der Wert einfach aufgerundet. Bei 1,5 wird automatisch auf 2 gerundet, also weniger als 0.
Math.Round verwendet die Rundung von Bankern und wird auf die nächste gerade Zahl gerundet, wenn die zu gerundende Zahl genau in die Mitte fällt.
Einfache Lösung, verwenden Sie Worksheetfunction.Round (). Das wird abrunden, wenn es am Rande ist.
Das hat bei mir funktioniert
Function round_Up_To_Int(n As Double)
If Math.Round(n) = n Or Math.Round(n) = 0 Then
round_Up_To_Int = Math.Round(n)
Else: round_Up_To_Int = Math.Round(n + 0.5)
End If
End Function
Ich finde die folgende Funktion ausreichend:
'
' Round Up to the given number of digits
'
Function RoundUp(x As Double, digits As Integer) As Double
If x = Round(x, digits) Then
RoundUp = x
Else
RoundUp = Round(x + 0.5 / (10 ^ digits), digits)
End If
End Function
Verwendete die Funktion "RDown" und "RUp" von ShamBhagwat und erstellte eine weitere Funktion, die den runden Teil zurückgibt (ohne "Ziffern" für die Eingabe angeben zu müssen)
Function RoundDown(a As Double, digits As Integer) As Double
RoundDown = Int((a + (1 / (10 ^ (digits + 1)))) * (10 ^ digits)) / (10 ^ digits)
End Function
Function RoundUp(a As Double, digits As Integer) As Double
RoundUp = RoundDown(a + (5 / (10 ^ (digits + 1))), digits)
End Function
Function RDownAuto(a As Double) As Double
Dim i As Integer
For i = 0 To 17
If Abs(a * 10) > WorksheetFunction.Power(10, -(i - 1)) Then
If a > 0 Then
RDownAuto = RoundDown(a, i)
Else
RDownAuto = RoundUp(a, i)
End If
Exit Function
End If
Next
End Function
die Ausgabe wird sein:
RDownAuto(458.067)=458
RDownAuto(10.11)=10
RDownAuto(0.85)=0.8
RDownAuto(0.0052)=0.005
RDownAuto(-458.067)=-458
RDownAuto(-10.11)=-10
RDownAuto(-0.85)=-0.8
RDownAuto(-0.0052)=-0.005
Hier ist einer, den ich gemacht habe. Es verwendet keine zweite Variable, die mir gefällt.
Points = Len(Cells(1, i)) * 1.2
If Round(Points) >= Points Then
Points = Round(Points)
Else: Points = Round(Points) + 1
End If