# How to trunc double precision number without rounding?

I have `'9.999999999'::double precision` number and I want to convert it to `decimal(8,2)` without any rounding. The result I am expecting is `9.99`. So far I tried:

``````select trunc('9.999'::double precision::numeric(8,3), 2)
``````

and it works but I have to know number of precision digits for double precision value because if there will be more `9` then `::numeric(8,3)` will automatically round it to `10.000`.

What I can do about it?

Why not simply do the following?

``````SELECT trunc(num, 2)
FROM (VALUES (         9.999999                  ),
(         9.999999999999999999999999),
(9999999999.999999999999999999999999)
) t(num);

/*
trunc
───────────────
9.99
9.99
9999999999.99
*/
``````

This way you just truncate it, without assuming anything about the digits.

Notes:

• it looks like you have numbers stored as text. Avoid this, if you can. If this is not the case, just don't explicitly cast anything. If it is, then:
• It might not be obvious, but my example is using `numeric` - this is the type the parser interprets `9.99999`, for example:
``````SELECT pg_typeof(9.99999);
pg_typeof
───────────
numeric
``````

That is, use an unlimited `numeric` in your example. This would accomodate all your digits.

• According to the documentation:

The types decimal and numeric are equivalent.