PRB: ROUND() Function Not Rounding Properly After Calculations

Last reviewed: October 29, 1996
Article ID: Q157954
The information in this article applies to:
  • Microsoft Visual FoxPro for Windows, versions 3.0, 3.0b, 5.0

SYMPTOMS

Using the ROUND() function after performing mathematical calculations on certain numeric values does not produce the correct result. The resulting number is not rounded correctly to the proper decimal place.

CAUSE

For some numeric values, the precision limit within FoxPro decreases after performing mathematical calculations.

WORKAROUND

Use the Currency data type when more accurate rounding of numeric values is necessary. However, using the Currency data type does not fix all rounding problems.

The following code example provides a workaround by converting the numeric contents of mpay to a string. Then the VAL() function converts the string back to a numeric data type for use in the ROUND() function.

   CLEAR
   mrate = 86.173125
   mhours = 24.0000
   mpay = mhours * mrate
   ? mpay
   test=STR(mpay,LEN(STR(mpay)),LEN(STR(mpay)))
   ? ROUND(mpay, 2)
   ? ROUND(VAL(test),2)

The code first returns the value of mpay. Next the incorrectly rounded value, followed by the correctly rounded value, appears. The above code may produce the correct result with every occurrence of rounding errors in Visual FoxPro.

The discrepancy of the ROUND() function's behavior is often related to a decrease in precision as Visual FoxPro performs calculations on several numbers. For instance, by placing the value of the variable mpay, 2068.1550000000, directly into the ROUND() function, the correct result appears. Type the following in the Command window:

   ? ROUND(2068.1550000000,2)

The correct value appears.

MORE INFORMATION

The following code examples illustrate possible rounding problems that may be encountered in Visual FoxPro.

Steps to Reproduce Behavior

  1. Create a program that contains the following lines of code:

          mrate = 86.173125
          mhours = 24.0000
          mpay = mhours * mrate
          ? mpay
          ? ROUND(mpay, 2)
    

  2. Close the program and run it.

  3. The ROUND()function returns 2068.15. This is incorrect. The value is not
rounded correctly to the second decimal place. The correct value should be 2068.16.


KBCategory: kb3rdparty kbprb
KBSubcategory: FxprgGeneral
Additional reference words: 3.00 3.00b 5.00 kbdsd VFoxWin



THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: October 29, 1996
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.