Die Dezimaltypen werden ja intern auf Byteblöcke gemapt. Die Precision und Scale Angaben in der Tabellendeklaration kann man (auch Plattform abhängig> Bitbreite) daher wohl eher als grobe Angaben verstehen.
Aus der Doku
On all currently supported platforms, the real type has a range of around 1E-37 to 1E+37 with a precision of at least 6 decimal digits
Der entscheidende Punkt ist hier demnach "at least 6. Es kann also auch mehr sein, implementierungs- und plattformabhängig.
Evtl. geht es Dir aber auch gar nicht um die Genauigkeit des Wertes, sondern um die reine Anzeige. Die musst Du bei Bedarf sowieso durch Formatfunktionen oder Rundungsoperationen herstellen.
Ist es umgekehrt, musst Du Dir genau überlegen, wieviel signifikante Stellen in den Typen abgelegt werden sollen und ob es geeignete Typen sind. Dass die Typen nicht zwingend reproduzierbare Werte in Nachkommastelle xy liefern, ist ebenfalls in der Doku erklärt.
real und double sind Datentypen die immer nur “ungefähr” den Wert speichern der angegeben wird. Nicht jede Zahl ist verlustfrei auf real oder double abbildbar. Deswegen kann es sein, dass Du einen anderen Wert zurückbekommst, als Du speicherst. Das liegt in der Natur der Sache. Wenn Du Wert auf exakte Zahlen legst, dann musst Du numeric nehmen.
Des weiteren gibt es dann auch noch einen Unterschied zwischen dem gespeicherten Wert und den Wert die der SQL client anzeigt - dort findet ja auch nochmal eine Formatierung und evtl. Rundung für die Anzeige statt.