Why have a numeric type hierarchy?
To some extent it's a convenience. Not all languages have the hierachy you speak of. For instance Ocaml has no such hierarchy and you need to explicitly cast integers to floats. (This is the price you pay for having type inference with principal types in Ocaml.)

But there are other reasons as well. Numeric types are there because we want to do math with computers. In mathematics there are many kinds of numbers, and they are naturally organized according to what structure they carry: the integers form a ring, the rationals form a field, the reals form a complete field, and the complex numbers a complete algebraically closed field. So the mathematical hierarchy gets reflected in the organization of numeric types.

In Haskell there are a number of numeric type classes (Num, Float, Rational, ...) which give the programmer flexibility and modularity. In Haskell it is very easy to switch from one kind of Num to another – as opposed to other software systems where it takes years to switch the numeric data types (consider how big a project it was from 32-bit to 64-bit Windows).