This query:
select nvl(0.75,0) from dual
gives me 0.75 (numeric) but this query:
select decode(1,0,null,0.75
In the first case, nvl() is returning a numeric value. How to display that is up to the program you are using to run your queries. TOAD displays it like you said, 0.75.
In the second example, decode() is returning a varchar2. When Oracle converts a number to a string without any formatting, this is what you get, i.e. ".75".
From the Oracle docs on decode():
If the first result has the datatype CHAR or if the first result is null, then Oracle converts the return value to the datatype VARCHAR2.
You could use a number format and rtrim() to achieve your purpose, e.g.:
select rtrim(to_char(.75, '9990.99999999999999'),'0') from dual;
Result:
0.75