|
De round functie is een altijd verassende functie die vaak niet werkt zoals men verwacht. Dit is niet alleen in LotusScript het geval maar ook Microsoft heeft een artikel geschreven over de werking in hun verschillende produkten: http://support.microsoft.com/kb/196652/EN-US/
De code voorbeelden uit het bovengenoemde artikel kunnen eenvoudig in LotusScipt gebruikt worden (BRound wordt door mij het meest gebruikt):
Function AsymDown(X As Double, Factor As Double) As Double If Factor = 0 Then Factor = 1 AsymDown = Int(X * Factor) / Factor End Function
Function SymDown(X As Double, Factor As Double) As Double If Factor = 0 Then Factor = 1 SymDown = Fix(X * Factor) / Factor ' Alternately: ' SymDown = AsymDown(Abs(X), Factor) * Sgn(X) End Function
Function AsymUp(X As Double, Factor As Double) As Double If Factor = 0 Then Factor = 1 Dim Temp As Double Temp = Int(X * Factor) AsymUp = (Temp + IIf(X = Temp, 0, 1)) / Factor End Function
Function SymUp(X As Double, Factor As Double ) As Double Dim Temp As Double If Factor = 0 Then Factor = 1 Temp = Fix(X * Factor) SymUp = (Temp + IIf(X = Temp, 0, Sgn(X))) / Factor End Function
Function AsymArith(X As Double, Factor As Double) As Double If Factor = 0 Then Factor = 1 AsymArith = Int(X * Factor + 0.5) / Factor End Function
Function SymArith(X As Double, Factor As Double ) As Double If Factor = 0 Then Factor = 1 SymArith = Fix(X * Factor + 0.5 * Sgn(X)) / Factor ' Alternately: ' SymArith = Abs(AsymArith(X, Factor)) * Sgn(X) End Function
Function BRound(X As Double, Factor As Double ) As Double ' For smaller numbers: ' BRound = CLng(X * Factor) / Factor Dim Temp As Double Dim FixTemp As Double If Factor = 0 Then Factor = 1 Temp = X * Factor FixTemp = Fix(Temp + 0.5 * Sgn(X)) ' Handle rounding of .5 in a special manner If Temp - Int(Temp) = 0.5 Then If FixTemp / 2 <> Int(FixTemp / 2) Then ' Is Temp odd ' Reduce Magnitude by 1 to make even FixTemp = FixTemp - Sgn(X) End If End If BRound = FixTemp / Factor End Function
Function RandRound(X As Double, Factor As Double ) As Double ' Should Execute Randomize statement somewhere prior to calling. Dim Temp As Double Dim FixTemp As Double If Factor = 0 Then Factor = 1 Temp = X * Factor FixTemp = Fix(Temp + 0.5 * Sgn(X)) ' Handle rounding of .5 in a special manner. If Temp - Int(Temp) = 0.5 Then ' Reduce Magnitude by 1 in half the cases. FixTemp = FixTemp - Int(Rnd * 2) * Sgn(X) End If RandRound = FixTemp / Factor End Function
Function AltRound(X As Double, Factor As Double ) As Double Static fReduce As Boolean Dim Temp As Double Dim FixTemp As Double If Factor = 0 Then Factor = 1 Temp = X * Factor FixTemp = Fix(Temp + 0.5 * Sgn(X)) ' Handle rounding of .5 in a special manner. If Temp - Int(Temp) = 0.5 Then ' Alternate between rounding .5 down (negative) and up (positive). If (fReduce And Sgn(X) = 1) Or (Not fReduce And Sgn(X) = -1) Then ' Or, replace the previous If statement with the following to ' alternate between rounding .5 to reduce magnitude and increase ' magnitude. ' If fReduce Then FixTemp = FixTemp - Sgn(X) End If fReduce = Not fReduce End If AltRound = FixTemp / Factor End Function
Function ADownDigits(X As Double, Digits As Integer ) As Double ADownDigits = AsymDown(X, 10 ^ Digits) End Function
Public Function IIf(blnExpression, vTrueResult, vFalseResult) If blnExpression Then IIf = vTrueResult Else IIf = vFalseResult End If 'Thanks to ElementK Journals End Function
|