Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Rounding Help Needed
Message
De
23/12/2003 16:59:48
 
Information générale
Forum:
Visual FoxPro
Catégorie:
Codage, syntaxe et commandes
Divers
Thread ID:
00861734
Message ID:
00861780
Vues:
22
>Why not to use "global" rounding function. With this you can define the rounding grade and if the value should be rounded with normal rounding rules or up to the nearest (f.ex 21.85 -> 25.00 you shoud call
>?nRound(21.85,5.0,1)
>
>AT
>
>P.S. Be careful to use right ratio between tlnvalue and tlnround (tlnround shoud be same magnitude or lesser than tlnvalue).
>
>
>
>Function nround(tlnvalue, tlnround, tnMode)
>
>  If Vartype(tnMode) # "N" Or !Inlist(tnMode,0,1)
>    tnMode = 0
>  Endif
>
>  *!* tlnvalue = Value to round
>  *!* tlnround = round grade (0.01 0.1 0.5 1.0 5.0 10.0 50.0 100.0 500.0 1000.0)
>  *!* tnMode = type of round
>  *!* tnMode = 1 always up to the nearest
>  *!* tnMode = 0 with normal rounding rules
>
>  Local ;
>    lnRetVal, ;
>    lnj, ;
>    lnk
>
>  Do Case
>    Case tlnround = 0.01 && 0.01
>      lnRetVal = Round(tlnvalue,2)
>    Case tlnround = 0.1 && 0.1
>      lnRetVal = Round(tlnvalue,1)
>    Case tlnround = 0.5 && 0.5
>      lnj = Round(tlnvalue,1)
>      lnk = Abs(Int(tlnvalue) - Round(tlnvalue,1))
>      Do Case
>        Case lnk>= 0 And lnk<0.3
>          lnk = 0
>        Case lnk> 0.2 And lnk<0.8
>          lnk = 0.5
>
>        Case lnk> 0.7 And lnk<1
>          lnk = 1
>      Endcase
>
>      lnRetVal = Round(Int(tlnvalue) + lnk,2)
>
>    Case tlnround = 1.0 && 1.0
>      lnRetVal = Round(tlnvalue,0)
>
>    Case tlnround = 5.0 &&  5.0
>      lnj = Round(tlnvalue,0)
>      lnj = lnj/10
>      lnk = Abs(Int(lnj) - lnj)
>      Do Case
>        Case lnk>= 0 And lnk<0.3
>          lnk = 0
>        Case lnk> 0.2 And lnk<0.8
>          lnk = 0.5
>
>        Case lnk> 0.7 And lnk<1
>          lnk = 1
>      Endcase
>
>      lnRetVal = 10*Round(Int(lnj) + lnk,2)
>
>    Case tlnround = 10.0 && 10.0
>      lnRetVal = Round(tlnvalue,-2)
>
>    Case tlnround = 50.0 && 50.0
>      lnj = Round(tlnvalue,-1)
>      lnj = lnj/100
>      lnk = Abs(Int(lnj) - lnj)
>      Do Case
>        Case lnk>= 0 And lnk<0.3
>          lnk = 0
>        Case lnk> 0.2 And lnk<0.8
>          lnk = 0.5
>
>        Case lnk> 0.7 And lnk<1
>          lnk = 1
>      Endcase
>
>      lnRetVal = 100*Round(Int(lnj) + lnk,2)
>
>
>    Case tlnround = 100.0 && 100.0
>      lnRetVal = Round(tlnvalue,-3)
>
>    Case tlnround = 500.0 && 500.0
>      lnj = Round(tlnvalue,-2)
>      lnj = lnj/1000
>      lnk = Abs(Int(lnj) - lnj)
>      Do Case
>        Case lnk>= 0 And lnk<0.3
>          lnk = 0
>        Case lnk> 0.2 And lnk<0.8
>          lnk = 0.5
>
>        Case lnk> 0.7 And lnk<1
>          lnk = 1
>      Endcase
>
>      lnRetVal = 1000*Round(Int(lnj) + lnk,2)
>
>
>    Case tlnround = 1000.0 && 1000.0
>      lnRetVal = Round(tlnvalue,-4)
>
>    Otherwise
>      lnRetVal = tlnvalue
>  Endcase
>
>  lnRetVal = lnRetVal+Iif(tnMode=0,0,Iif(tlnvalue>lnRetVal,tlnround,0))
>
>  Return lnRetVal
>
>Endfunc
>
I think your function could be shorten by the following and round grade could be what ever multiple you want.
Function nround(tlnvalue, tlnround, tnMode)
  If Vartype(tnMode) # "N" Or !Inlist(tnMode,0,1)
    tnMode = 0
  Endif

  *!* tlnvalue = Value to round
  *!* tlnround = round grade
  *!* tnMode = type of round
  *!* tnMode = 1 always up to the nearest
  *!* tnMode = 0 with normal rounding rules

  IF tnMode = 0
     *-- Just round
     lnRetVal = ROUND(tlnvalue/tlnround,0) * tlnround
  ELSE
     *-- Always round up
     lnRetVal = CEILING(tlnvalue/tlnround) * tlnround
  ENDIF

  Return lnRetVal

Endfunc
Charles

"The code knows no master." - Chuck Mautz
"Everybody is ignorant, only on different subjects." - Will Rogers
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform