Yes buddy, the extra sub querry is needed, as in below case :
SELECT * FROM <tab> WHERE rownum <=5
ORDER BY <a> desc
the first 5 rown are getting sorted and then ordered, which would not essesntaily return max 5 values.
However if we use it as :
SELECT * FROM (SELECT a FROM <tbl> ORDER BY a DESC) WHERE rownum<=5;
the results are first ordered in desceding order i.e max to lowest and on selecting the frist 5 rows, we get the 5 max values.