By dense, I think you mean that the closure of the rationals is the set of the real numbers, which is the same as saying that every open interval of R intersects Q. We can do this by means of the decimal representation of a rational number, but I think it's better to take a different approach. Let's show that for every real numbers x < y there is a rational r in (x, y).
To make things simpler, first suppose 0 <= x < y, with y - x >1. Then, there exists a postive integer n - so a rational number - satisfying x < n < y, which proves the assertion for this 1st case.
Now, suppose 0 <= x < y with y - x <=1. By the Archmedian property of the natural numbers, there exists a positive integer n such that n(y - x) = ny - nx > 1. By the previous conclusion, there exists a positive integer m such that
nx < m < ny => x < m/n < y. So, m/n is a rational in (x, y).
Finally, suppose x < y are any real numbers. There exists
a rational r1 such that 0 < r1 + x < r1 + y. From what we have seen, there exists a rational r2 such that
r1 + x < r2 < r1 + y => x < r2 - r1 < y. So, r2 - r1 is a rational in (x, y).
The proof is now complete.
This can also be done based on the construction of the set of real numbers from the rationals. One approach is based on Cauchy sequences. In this approach, a real number is defined as the limit of a Cauchy sequence, which makes the conclusuion automatic.
Anoter approach is by means of Dedekind's cuts.