I think that what you're seeing here is Oracle's built-in effort to avoid an ORA-01438 error when applying a function to a number with restricted precision and scale. By default you would not want the precision and scale of COL1 and COL2 to be applied in the expression (COL1/COL2), or AVG(COL1).
So, Oracle applies a generic NUMBER data type without restrictions on precision and scale. I believe it does something similar with VarChar2 functions.
What might be worth trying is to explicitly cast the Sum() result:
Cast(Sum(col1) as Number(22,3))
If you exceed a precision of 22 on the result though you'll get an:
ORA-01438: value larger than specified precision allowed for this column
Lastly, in case you weren't aware, exceeding the scale does not raise an error -- if you exceed the specified scale the number just gets rounded to the maximum scale possible.