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.