I think it would be helpful if symbolic functions like Integrate and Minimize automatically rationalized their inputs, rather than calling the numerical version (NIntegrate or NMinimize).
NIntegrate can only handle integrals that would result in a number. So NIntegrate[0.4 a b, {b, 0, 1}] can’t be done (but Integrate[0.4 a b, {b, 0, 1}] can be done). So I’m not sure if Integrate always calls NIntegrate when there are approximate values…