Обсуждение: cast numeric with scale and precision to numeric plain

Поиск
Список
Период
Сортировка

cast numeric with scale and precision to numeric plain

От
Sim Zacks
Дата:
I'm using 8.2.4


Numeric with scale precision always shows the trailing zeros.

Numeric plain only shows numbers after the decimal point that are being
used.


I would like to have the data in my table with scale and precision, but
my views to be cast to numeric without any scale or precision.

However, when I cast a numeric(16,4) to a ::numeric it doesn't cast it.


In order to get the results I want, I have to cast it twice ::double
precision::numeric and then it removes the trailing zeros.


Is there any way to cast directly from numeric with scale and precision
to plain numeric?


example:


create table test(f1 numeric(16,4));

insert into test(f1)values(15),(200.004),(12.4123);
select f1 from test;
15.0000
200.0040
12.4123


select f1::numeric from test
15.0000
200.0040
12.4123


select f1::float::numeric from test
15
200.004
12.4123



Re: cast numeric with scale and precision to numeric plain

От
Tom Lane
Дата:
Sim Zacks <sim@compulab.co.il> writes:
> Numeric with scale precision always shows the trailing zeros.
> Numeric plain only shows numbers after the decimal point that are being
> used.

That statement is false:

regression=# select 1234.000::numeric;
 numeric
----------
 1234.000
(1 row)

I'm not sure offhand what is the easiest way to suppress trailing
zeroes, but casting to plain numeric is not the route to a solution.

Really this is a textual formatting problem.  You might find that the
best bet is something with trim() or a regexp.  The trick would be
not removing zeroes that are significant ...

            regards, tom lane

Re: cast numeric with scale and precision to numeric plain

От
Sim Zacks
Дата:
<meta content="text/html;charset=windows-1255"
 http-equiv="Content-Type">





    Numeric with scale precision always shows the trailing zeros.
Numeric plain only shows numbers after the decimal point that are being
used.



That statement is false:

regression=# select 1234.000::numeric;
 numeric
----------
 1234.000
(1 row)

I'm not sure offhand what is the easiest way to suppress trailing
zeroes, but casting to plain numeric is not the route to a solution.

Really this is a textual formatting problem.  You might find that the
best bet is something with trim() or a regexp.  The trick would be
not removing zeroes that are significant ...

            regards, tom lane


According to the documentation, numeric is stored without any leading
or trailing zeros.
http://www.postgresql.org/docs/current/static/datatype-numeric.html
Numeric values are physically stored without
any extra leading or
trailing zeroes. Thus, the declared precision and scale of a column are
maximums, not fixed allocations. (In this sense the numeric
type is more akin to varchar(n)
than to char(n).)
The actual storage requirement is two bytes for each group of four
decimal digits, plus eight bytes overhead.
However, in practice:
create table test(f1 numeric);
insert into test(f1)values(15.000);
select * from test;
f1
-------
15.000

Re: cast numeric with scale and precision to numeric plain

От
Adrian Klaver
Дата:
On Tuesday 20 October 2009 3:39:22 am Sim Zacks wrote:
> Numeric with scale precision always shows the trailing zeros.
> Numeric plain only shows numbers after the decimal point that are being
> used.
>
>
> That statement is false:
>
> regression=# select 1234.000::numeric;
>  numeric
> ----------
>  1234.000
> (1 row)
>
> I'm not sure offhand what is the easiest way to suppress trailing
> zeroes, but casting to plain numeric is not the route to a solution.
>
> Really this is a textual formatting problem.  You might find that the
> best bet is something with trim() or a regexp.  The trick would be
> not removing zeroes that are significant ...
>
>                         regards, tom lane
>
>  According to the documentation, numeric is stored without any leading or
> trailing zeros.
> http://www.postgresql.org/docs/current/static/datatype-numeric.html
>
> Numeric values are physically stored without any extra leading or trailing
> zeroes. Thus, the declared precision and scale of a column are maximums,
> not fixed allocations. (In this sense the numeric type is more akin to
> varchar(n) than to char(n).) The actual storage requirement is two bytes
> for each group of four decimal digits, plus eight bytes overhead. However,
> in practice:
>  create table test(f1 numeric);
>  insert into test(f1)values(15.000);
>  select * from test;
>  f1
>  -------
>  15.000

The part of the above that you need to look at is where it says it does not
store 'any extra leading or trailing zeroes'. In your case you entered the
value with three trailing zeroes which are taken to be significant (see Toms
reply also). If you had inserted just 15 you would have gotten back 15.

--
Adrian Klaver
aklaver@comcast.net

Re: cast numeric with scale and precision to numeric plain

От
Tom Lane
Дата:
Sim Zacks <sim@compulab.co.il> writes:
>>> I'm not sure offhand what is the easiest way to suppress trailing
>>> zeroes, but casting to plain numeric is not the route to a solution.

> According to the documentation, numeric is stored without any leading
> or trailing zeros.

That says *stored*; it doesn't say *displayed*.

            regards, tom lane

Re: cast numeric with scale and precision to numeric plain

От
Sim Zacks
Дата:
>> According to the documentation, numeric is stored without any leading
>> or trailing zeros.
>>
>
> That says *stored*; it doesn't say *displayed*.
>
>             regards, tom lane
>
If it displays them, it has to know they exist. That means it stores it
somewhere.
> The part of the above that you need to look at is where it says it does not
> store 'any extra leading or trailing zeroes'. In your case you entered the
> value with three trailing zeroes which are taken to be significant (see Toms
> reply also). If you had inserted just 15 you would have gotten back 15.
>
I guess that's a matter of interpretation. To me zeros after a decimal
point without anything else after them are extra.

Re: cast numeric with scale and precision to numeric plain

От
Scott Marlowe
Дата:
2009/10/20 Sim Zacks <sim@compulab.co.il>:
> I guess that's a matter of interpretation. To me zeros after a decimal
> point without anything else after them are extra.

From a mathematical perspective, they most certainly are not extra.

15.000
15.001
15.002
15.003

Each have three digits of precision, and each mean something here.

Re: cast numeric with scale and precision to numeric plain

От
Adrian Klaver
Дата:
----- "Sim Zacks" <sim@compulab.co.il> wrote:

> >> According to the documentation, numeric is stored without any
> leading
> >> or trailing zeros.
> >>
> >
> > That says *stored*; it doesn't say *displayed*.
> >
> >             regards, tom lane
> >
> If it displays them, it has to know they exist. That means it stores
> it
> somewhere.
> > The part of the above that you need to look at is where it says it
> does not
> > store 'any extra leading or trailing zeroes'. In your case you
> entered the
> > value with three trailing zeroes which are taken to be significant
> (see Toms
> > reply also). If you had inserted just 15 you would have gotten back
> 15.
> >
> I guess that's a matter of interpretation. To me zeros after a
> decimal
> point without anything else after them are extra.

See below for an explanation of why the above statement is incorrect.
http://en.wikipedia.org/wiki/Significant_figures



Adrian Klaver
aklaver@comcast.net


Re: cast numeric with scale and precision to numeric plain

От
Scott Bailey
Дата:
Sim Zacks wrote:
> I'm using 8.2.4
>
>
> Numeric with scale precision always shows the trailing zeros.
>
> Numeric plain only shows numbers after the decimal point that are being
> used.
>
>
> I would like to have the data in my table with scale and precision, but
> my views to be cast to numeric without any scale or precision.
>
> However, when I cast a numeric(16,4) to a ::numeric it doesn't cast it.
>
>
> In order to get the results I want, I have to cast it twice ::double
> precision::numeric and then it removes the trailing zeros.
>
>
> Is there any way to cast directly from numeric with scale and precision
> to plain numeric?


So you already got your answer about why it doesn't work the way you'd
like. But if you are just looking to format it for display you can use
to_char with the FM modifier.

SELECT f1, to_char(f1, 'FM999.0999')
FROM test;
15.0000   15.0
200.0040  200.004
12.4123   12.4123