Closing. Congratulations, you have learned that computers do not operate at infinite precision; they will have rounding errors. This will happen with any programming language, framework or toolkit you ever use, because the rounding errors happen all the way down at the CPU level.

For example, calculate (1/3) * 3 to 6 decimal places of precision: you get 0.999999, not 1. That's basically what happens in computer memory, since it can't store an infinite sequence of digits!

Workaround: only ever compare if a number is within a small range, e.g. abs(a - b) < 0.001.

Computers work in binary. In binary, lots of numbers are actually recurring fractions (like 0.3333...) when they can be written as a short number in decimal. I checked and 1.2 is one of these numbers that recurs infinitely in binary, and therefore gets truncated.

Construct 2 is smart enough to calculate constant expressions at export-time with high precision. In other words, if you type 18 * 1.2 in an expression, the game doesn't actually do a multiplication. I guess the editor does this at a higher precision than the runtime which is why it gives the correct answer.

tr((18*(10*anyval))/10) this give me 21.6

By multiplying by 10, you go from 1.2 (which requires an infinite number of binary digits) to 12 (which is an integer and can be represented in a finite number of binary digits). So you get a different answer. This is all exactly the same cause as I explained earlier, and will be reproducible in any programming language, framework, engine or computer system whatsoever, unless they deliberately use enhanced precision calculations (such as in financial software).