INECO Forum Overzicht Overzicht Aanmelden Aanmelden Registreer Registreer Profiel Profiel Ledenlijst Ledenlijst Groepen Groepen Zoeken Zoeken

Round functie in LotusScript
 
 
 
 
 Geplaatst   Bericht 
Marcel Rothuizen

Marcel Rothuizen
 

Aanmelddatum: 10-11-2000
Woonplaats: Heteren (Gld)
Datum: 30-05-2007 07:53:50    Bericht: Round functie in LotusScript

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

 E-mail Website ICQ MSNM Skype Hyves LinkedIn 
Zoek in afgelopen ok
 
   Overzicht / Lotus Notes Ontwikkeling / Lotusscript  
Pagina 1 van 1 

IBM LOTUS NOTES migratie doet u samen met INECO

Powered by Lotus Domino R8.5.3 on Fedora Core 14 Dit  forum is gemaakt door Intranet &  Network Consultancy. © 2011.
Voor vragen of opmerkingen  kunt u contact opnemen met:  .
Deze site is gemaakt met Lotus Notes R8.5.3 en draait op Fedora Core 14.

INECO Support Contract banner