Domino 9 und frühere Versionen > ND8: Entwicklung
LotusScript: Format()/Round() runden Summe auf
Peter Klett:
Sorry, dass ich klugsch ...
E4 = 2 / 10^1 = 0.2
Bei der letzten Zeile hast Du Dich vertippt. Ansonsten eine schicke Formel.
(Für die, die nur kopieren ... :))
ghostmw:
Danke das ist durchgerutscht ...
Gravedigger:
Hallo,
vielen, vielen Dank für eure Antworten. Mit dem Workaround von IBM haben wir das Ziel erreicht.
Gruß
gravedigger
pram:
Zur Info: Es ist meiner Meinung nach kein Bug, sondern "works as designed". ;D
Es gibt 2 Rundungsverfahren: Das mathematische und das kaufmännische.
http://de.wikipedia.org/wiki/Rundung#Mathematische_Rundung
Dadurch werden beim Addieren vieler (gerundeter) Zahlen die Fehler besser heraus gemittelt. Nur ist dieses im Finanzumfeld unbrauchbar.
Gruß
Roland
marschul:
So, jetzt hat mich das hier so oft diskutierte Thema "Runden" auch erwischt, denn eine Kollegin hat in einem Zins- und Tilgungsplan entdeckt, dass bei einer "glatten" 5 als dritte Dezimalstelle gelegentlich an der 2. Nachkommastelle abgerundet wird.
Also habe ich den Vorschlag von Marco aufgegriffen und in einer Klasse eine Funktion wie folgt erstellt:
--- Code: ---Private Const conModule = "clsRound."
Public Class clsRound
... div. Private & Public Properties + Sub New ...
Public Function roundValue(Byval dInputValue As Double, Byval iDigits As Integer) As Boolean
On Error Goto processError
Dim sMethod As String
sMethod = "roundValue: "
roundValue = False
Dim dTmpVal1 As Double, dTmpVal2 As Double, dTmpVal3 As Double, dDigits As Double, dAdd As Double
dDigits = 10^iDigits
dAdd = 0.50
dTmpVal1 = dInputValue * dDigits
dTmpVal2 = dTmpVal1 + dAdd
dTmpVal3 = Fix(dTmpVal2)
dResult = dTmpVal3 / dDigits
roundValue = True
exitFunction:
Exit Function
processError:
sErrorString = conModule & sMethod & " Allgem. Fehler: " & Str(Err) & " " & Error$ & " Zeile: " & Str(Erl)
Resume exitFunction
End Function 'roundValue
...End Class
--- Ende Code ---
Die vielen Zwischenvariablen sind erst nach und nach entstanden, denn das Ergebnis stimmte leider nicht immer :(
Bei einem übergebenem Wert 322.194,925 wurde richtigerweise 322.194,93 zurückgegeben.
Für 285.146,225 erhielt ich jedoch 285.146,22!
Diverse Prints zeigten folgende Werte:
dInputValue = 285146,225
dTmpVal1 = 28514622,5
dTmpVal2 = 28514623
dTmpVal3 = 28514622
dResult = 285146,22
D.h. bei dem Fix() wurde die scheinbare Ganzzahl ...23 auf ...22 geändert. Diverse Eingriffe (z.B. statt 0.5 eine Addition mit 1/2 etc.) haben nix gebracht.
Ein Print von Fraction(dTmpVal2) zeigte dann unerwartet statt ,0 einen Wert von ,999999967usw.
Unschöne, aber funktionierende Lösung:
--- Code: ---dTmpVal = Cdbl(Cstr(dTmpVal1 + dAdd))
--- Ende Code ---
Das Parsen in einen String und wieder zurück in einen Double sorgt bei allen Werten für korrekte Ergebnisse.
Navigation
[0] Themen-Index
[*] Vorherige Sete
Zur normalen Ansicht wechseln