Here’s the definitive postgresql docs. on the all simple (not compound) numeric datatypes subject (V 14)
https://www.postgresql.org/docs/current/datatype-numeric.html
So why do “real” and “double precision” datatypes exist if they are not accurate. Sometimes close is good enough 😉
Name Storage Size Description Range smallint 2 bytes small-range integer -32768 to +32767 integer 4 bytes typical choice for integer -2147483648 to +2147483647 bigint 8 bytes large-range integer -9223372036854775808 to +9223372036854775807 decimal variable user-specified precision, exact up to 131072 digits before the decimal point; up to 16383 digits after the decimal point numeric variable user-specified precision, exact up to 131072 digits before the decimal point; up to 16383 digits after the decimal point real 4 bytes variable-precision, inexact 6 decimal digits precision double precision 8 bytes variable-precision, inexact 15 decimal digits precision smallserial 2 bytes small autoincrementing integer 1 to 32767 serial 4 bytes autoincrementing integer 1 to 2147483647 bigserial 8 bytes large autoincrementing integer 1 to 9223372036854775807