Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Rounding Help Needed
Message
General information
Forum:
Visual FoxPro
Category:
Coding, syntax & commands
Miscellaneous
Thread ID:
00861734
Message ID:
00861776
Views:
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
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform