It's because the 3rd parameter of your decode statement is NULL; as per the documentation1 (my emphasis).
Oracle automatically converts expr and each search value to the data type of the first search value before comparing.... If the first result has the data type CHAR or if the first result is null, then Oracle converts the return value to the data type VARCHAR2.
In your case the first result is NULL, which Oracle treats as a VARCHAR2. Your return value is being implicitly converted to a VARCHAR2. If you changed your DECODE()
to the following you'd get a number:
select decode(1, 0, 0, 0.75)
and you could achieve your NULL by using the NULLIF()
function:
select nullif(decode(1, 0, 0, 0.75), 0) ...
It's better to use a CASE statement, which enforces that all returned datatypes are the same:
select case 1 when 0 then null
else 0.75
end ...
1. which I've been caught out on as well.