because a number an take upto 22 bytes, that is what this is saying. Your numbers - no, but numbers take upto 22 bytes.
you care about the precision and scale for numbers, not the data length.
ops$tkyte@ORA9IR2> create table t ( a number(3), b varchar2(20), c number(7,2) );
Table created.
ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> insert into t values ( -999, rpad('x',20,'x'), -99999.99 );
1 row created.
ops$tkyte@ORA9IR2>
ops$tkyte@ORA9IR2> select vsize(a), vsize(b), vsize(c) from t;
VSIZE(A) VSIZE(B) VSIZE(C)
---------- ---------- ----------
4 20 6
to the 4, 20 and 6 you must add a null flag (1 byte each) and to the varchar2, a leading length byte.
so, 4+20+6+3+1 = 34