BUG: ROUND() Function Not Rounding Properly After Calculations (157954)



The information in this article applies to:

  • Microsoft Visual FoxPro for Windows 3.0
  • Microsoft Visual FoxPro for Windows 3.0b
  • Microsoft Visual FoxPro for Windows 5.0
  • Microsoft Visual FoxPro for Windows 6.0

This article was previously published under Q157954

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.

RESOLUTION

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.

STATUS

Microsoft has confirmed this to be a problem in the Microsoft products listed at the beginning of this article.

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.

Modification Type:MajorLast Reviewed:12/1/2003
Keywords:kb3rdparty kbbug KB157954