Es un comportamiento propio de las variables de usuario de MySQL.
Al principio, las variables de usuario no tienen tipo de dato, su valor es NULL, y se redefinen con el primer valor que se almacena en ellas. En tu caso pasan a ser DECIMAL, dada la longitud del dato con el que se definen en la primera columna, y el truncado se produce por redondeo hacia abajo.
En la segunda ejecución ya tienen tipo de dato, decimal, y la operación genera una conversión implícita en FLOAT, cuyo redondeo es hacia arriba.
Código MySQL:
Ver originalmysql
> select @a
:= 992.75 Inicial
, (@a
* (1 + 18 / 100)) completo
, ROUND(@a
* (1 + 18 / 100), 2) Total
;+---------+----------+---------+
| Inicial | completo | Total |
+---------+----------+---------+
| 992.75 | 1171.445 | 1171.44 |
+---------+----------+---------+
mysql
> select @a
:= 992.75 Inicial
, (@a
* (1 + 18 / 100)) completo
, ROUND(@a
* (1 + 18 / 100), 2) Total
;+---------+-------------------------------------+---------+
| Inicial | completo | Total |
+---------+-------------------------------------+---------+
| 992.75 | 1171.445000000000000000000000000000 | 1171.45 |
+---------+-------------------------------------+---------+