Este problema se debe a que las macros, como cualquier programa, trabajan internamente con números binarios, de base dos. Al pasar los números decimales a binarios, y luego volver al sistema decimal para mostrar los resultados, se pueden producir errores de redondeo por cifras que “se quedan en el camino”.
Una forma de resolver el problema es controlar las cifras decimales dentro de la macro y evitar el uso de la función de redondeo Round. Por ejemplo, supongamos que obtenemos un resultado en la variable x y queremos dejarle solamente tres decimales. La manera “oficial” de hacerlo sería con la fórmula Round(x, 3). El primer argumento es el valor por redondear y el segundo, la cantidad de decimales.
Para evitar los errores que podría producir esta función, usamos esta otra fórmula:
Int( x * 1000) / 1000.
Al multiplicar por 1000 convertimos en enteras las tres primeras cifras decimales, mientras que al aplicar la función Int descartamos los demás decimales. Por último, al dividir por 1000, volvemos a pasar a la parte decimal las tres últimas cifras.
La fórmula anterior hace “redondeo truncado”: descarta directamente todo lo que haya a partir de la cuarta cifra decimal. Si queremos hacer “redondeo simétrico”, sumando una unidad a la última cifra decimal si la siguiente cifra es mayor o igual a cinco, podemos usar esta otra fórmula:
Int(x * 1000 + 0.5) / 1000
Los decimales más allá de la tercera cifra, más medio decimal, suman una unidad en la tercera posición, como corresponde al redondeo simétrico.