mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-28 21:01:48 +02:00
Add documentation and regression tests concerning rounding of numerics.
Michael Paquier, reviewed by Fabien Coelho
This commit is contained in:
parent
8eb6407aae
commit
5e7c3d91bf
@ -612,6 +612,31 @@ NUMERIC
|
||||
equivalent. Both types are part of the <acronym>SQL</acronym>
|
||||
standard.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
When rounding values, the <type>numeric</type> type rounds ties away
|
||||
from zero, while (on most machines) the <type>real</type>
|
||||
and <type>double precision</type> types round ties to the nearest even
|
||||
number. For example:
|
||||
|
||||
<programlisting>
|
||||
SELECT x,
|
||||
round(x::numeric) AS num_round,
|
||||
round(x::double precision) AS dbl_round
|
||||
FROM generate_series(-3.5, 3.5, 1) as x;
|
||||
x | num_round | dbl_round
|
||||
------+-----------+-----------
|
||||
-3.5 | -4 | -4
|
||||
-2.5 | -3 | -2
|
||||
-1.5 | -2 | -2
|
||||
-0.5 | -1 | -0
|
||||
0.5 | 1 | 0
|
||||
1.5 | 2 | 2
|
||||
2.5 | 3 | 2
|
||||
3.5 | 4 | 4
|
||||
(8 rows)
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect2>
|
||||
|
||||
|
||||
|
@ -286,3 +286,23 @@ FROM (VALUES (-2.5::float8),
|
||||
2.5 | 2
|
||||
(7 rows)
|
||||
|
||||
-- check rounding when casting from numeric
|
||||
SELECT x, x::int2 AS int2_value
|
||||
FROM (VALUES (-2.5::numeric),
|
||||
(-1.5::numeric),
|
||||
(-0.5::numeric),
|
||||
(0.0::numeric),
|
||||
(0.5::numeric),
|
||||
(1.5::numeric),
|
||||
(2.5::numeric)) t(x);
|
||||
x | int2_value
|
||||
------+------------
|
||||
-2.5 | -3
|
||||
-1.5 | -2
|
||||
-0.5 | -1
|
||||
0.0 | 0
|
||||
0.5 | 1
|
||||
1.5 | 2
|
||||
2.5 | 3
|
||||
(7 rows)
|
||||
|
||||
|
@ -383,3 +383,23 @@ FROM (VALUES (-2.5::float8),
|
||||
2.5 | 2
|
||||
(7 rows)
|
||||
|
||||
-- check rounding when casting from numeric
|
||||
SELECT x, x::int4 AS int4_value
|
||||
FROM (VALUES (-2.5::numeric),
|
||||
(-1.5::numeric),
|
||||
(-0.5::numeric),
|
||||
(0.0::numeric),
|
||||
(0.5::numeric),
|
||||
(1.5::numeric),
|
||||
(2.5::numeric)) t(x);
|
||||
x | int4_value
|
||||
------+------------
|
||||
-2.5 | -3
|
||||
-1.5 | -2
|
||||
-0.5 | -1
|
||||
0.0 | 0
|
||||
0.5 | 1
|
||||
1.5 | 2
|
||||
2.5 | 3
|
||||
(7 rows)
|
||||
|
||||
|
@ -866,3 +866,23 @@ FROM (VALUES (-2.5::float8),
|
||||
2.5 | 2
|
||||
(7 rows)
|
||||
|
||||
-- check rounding when casting from numeric
|
||||
SELECT x, x::int8 AS int8_value
|
||||
FROM (VALUES (-2.5::numeric),
|
||||
(-1.5::numeric),
|
||||
(-0.5::numeric),
|
||||
(0.0::numeric),
|
||||
(0.5::numeric),
|
||||
(1.5::numeric),
|
||||
(2.5::numeric)) t(x);
|
||||
x | int8_value
|
||||
------+------------
|
||||
-2.5 | -3
|
||||
-1.5 | -2
|
||||
-0.5 | -1
|
||||
0.0 | 0
|
||||
0.5 | 1
|
||||
1.5 | 2
|
||||
2.5 | 3
|
||||
(7 rows)
|
||||
|
||||
|
@ -866,3 +866,23 @@ FROM (VALUES (-2.5::float8),
|
||||
2.5 | 2
|
||||
(7 rows)
|
||||
|
||||
-- check rounding when casting from numeric
|
||||
SELECT x, x::int8 AS int8_value
|
||||
FROM (VALUES (-2.5::numeric),
|
||||
(-1.5::numeric),
|
||||
(-0.5::numeric),
|
||||
(0.0::numeric),
|
||||
(0.5::numeric),
|
||||
(1.5::numeric),
|
||||
(2.5::numeric)) t(x);
|
||||
x | int8_value
|
||||
------+------------
|
||||
-2.5 | -3
|
||||
-1.5 | -2
|
||||
-0.5 | -1
|
||||
0.0 | 0
|
||||
0.5 | 1
|
||||
1.5 | 2
|
||||
2.5 | 3
|
||||
(7 rows)
|
||||
|
||||
|
@ -730,6 +730,30 @@ SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round;
|
||||
(7 rows)
|
||||
|
||||
DROP TABLE ceil_floor_round;
|
||||
-- Check rounding, it should round ties away from zero.
|
||||
SELECT i as pow,
|
||||
round((-2.5 * 10 ^ i)::numeric, -i),
|
||||
round((-1.5 * 10 ^ i)::numeric, -i),
|
||||
round((-0.5 * 10 ^ i)::numeric, -i),
|
||||
round((0.5 * 10 ^ i)::numeric, -i),
|
||||
round((1.5 * 10 ^ i)::numeric, -i),
|
||||
round((2.5 * 10 ^ i)::numeric, -i)
|
||||
FROM generate_series(-5,5) AS t(i);
|
||||
pow | round | round | round | round | round | round
|
||||
-----+----------+----------+----------+---------+---------+---------
|
||||
-5 | -0.00003 | -0.00002 | -0.00001 | 0.00001 | 0.00002 | 0.00003
|
||||
-4 | -0.0003 | -0.0002 | -0.0001 | 0.0001 | 0.0002 | 0.0003
|
||||
-3 | -0.003 | -0.002 | -0.001 | 0.001 | 0.002 | 0.003
|
||||
-2 | -0.03 | -0.02 | -0.01 | 0.01 | 0.02 | 0.03
|
||||
-1 | -0.3 | -0.2 | -0.1 | 0.1 | 0.2 | 0.3
|
||||
0 | -3 | -2 | -1 | 1 | 2 | 3
|
||||
1 | -30 | -20 | -10 | 10 | 20 | 30
|
||||
2 | -300 | -200 | -100 | 100 | 200 | 300
|
||||
3 | -3000 | -2000 | -1000 | 1000 | 2000 | 3000
|
||||
4 | -30000 | -20000 | -10000 | 10000 | 20000 | 30000
|
||||
5 | -300000 | -200000 | -100000 | 100000 | 200000 | 300000
|
||||
(11 rows)
|
||||
|
||||
-- Testing for width_bucket(). For convenience, we test both the
|
||||
-- numeric and float8 versions of the function in this file.
|
||||
-- errors
|
||||
|
@ -102,3 +102,13 @@ FROM (VALUES (-2.5::float8),
|
||||
(0.5::float8),
|
||||
(1.5::float8),
|
||||
(2.5::float8)) t(x);
|
||||
|
||||
-- check rounding when casting from numeric
|
||||
SELECT x, x::int2 AS int2_value
|
||||
FROM (VALUES (-2.5::numeric),
|
||||
(-1.5::numeric),
|
||||
(-0.5::numeric),
|
||||
(0.0::numeric),
|
||||
(0.5::numeric),
|
||||
(1.5::numeric),
|
||||
(2.5::numeric)) t(x);
|
||||
|
@ -145,3 +145,13 @@ FROM (VALUES (-2.5::float8),
|
||||
(0.5::float8),
|
||||
(1.5::float8),
|
||||
(2.5::float8)) t(x);
|
||||
|
||||
-- check rounding when casting from numeric
|
||||
SELECT x, x::int4 AS int4_value
|
||||
FROM (VALUES (-2.5::numeric),
|
||||
(-1.5::numeric),
|
||||
(-0.5::numeric),
|
||||
(0.0::numeric),
|
||||
(0.5::numeric),
|
||||
(1.5::numeric),
|
||||
(2.5::numeric)) t(x);
|
||||
|
@ -215,3 +215,13 @@ FROM (VALUES (-2.5::float8),
|
||||
(0.5::float8),
|
||||
(1.5::float8),
|
||||
(2.5::float8)) t(x);
|
||||
|
||||
-- check rounding when casting from numeric
|
||||
SELECT x, x::int8 AS int8_value
|
||||
FROM (VALUES (-2.5::numeric),
|
||||
(-1.5::numeric),
|
||||
(-0.5::numeric),
|
||||
(0.0::numeric),
|
||||
(0.5::numeric),
|
||||
(1.5::numeric),
|
||||
(2.5::numeric)) t(x);
|
||||
|
@ -667,6 +667,16 @@ INSERT INTO ceil_floor_round VALUES ('-0.000001');
|
||||
SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round;
|
||||
DROP TABLE ceil_floor_round;
|
||||
|
||||
-- Check rounding, it should round ties away from zero.
|
||||
SELECT i as pow,
|
||||
round((-2.5 * 10 ^ i)::numeric, -i),
|
||||
round((-1.5 * 10 ^ i)::numeric, -i),
|
||||
round((-0.5 * 10 ^ i)::numeric, -i),
|
||||
round((0.5 * 10 ^ i)::numeric, -i),
|
||||
round((1.5 * 10 ^ i)::numeric, -i),
|
||||
round((2.5 * 10 ^ i)::numeric, -i)
|
||||
FROM generate_series(-5,5) AS t(i);
|
||||
|
||||
-- Testing for width_bucket(). For convenience, we test both the
|
||||
-- numeric and float8 versions of the function in this file.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user