Looks to me like the problem is your * 100 at the end. The casting to decimal(x,3) or decimal(x,2) is giving 2 decimal precision prior to the multiplication. Also, if one of the two part to the division equation = float, the result will = float data type. cast both parts of the division equation separately, and then you will get the appropriate answer.
ie cast(number1 as decimal(18,4)) / cast(number2 as decimal(18,4)) * 100
In this case, the result of the division problem will have a precision of 4 decimal places. When multiplying by 100 you are basically shifting the precision 2 places to the left with a result of 2 decimal precision. If you don't wish to see the trailing zeros wrap the whole thing in another cast( as decimal(18,2))