Обсуждение: Implementing rounding rule in plpgsql

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

Implementing rounding rule in plpgsql

От
jeff sacksteder
Дата:
Due to application requirements, I need to implement a rounding function that is independant of the baked-in rounding functionality. I'd prefer to do it in plpgsql for maximum portability.
To do this, I'll need to sequentially walk through the digits of an arbritarily long floating-point number. I can't think of a good way to do this.

I would greatly appreciate pointers to similar example code or discussion of the method for doing this..

Re: Implementing rounding rule in plpgsql

От
Michael Fuhr
Дата:
On Sun, Nov 20, 2005 at 02:01:02AM -0500, jeff sacksteder wrote:
> Due to application requirements, I need to implement a rounding function
> that is independant of the baked-in rounding functionality. I'd prefer to do
> it in plpgsql for maximum portability.
> To do this, I'll need to sequentially walk through the digits of an
> arbritarily long floating-point number. I can't think of a good way to do
> this.

This wouldn't be a homework assignment, would it?  Anyway, maybe
this will give you some ideas:

CREATE FUNCTION myround(num double precision) RETURNS double precision AS $$
DECLARE
    textval  text := num;
    i        integer;
BEGIN
    FOR i IN 1 .. length(textval) LOOP
        RAISE INFO '[%] = %', i, substr(textval, i, 1);
    END LOOP;

    RETURN num;
END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;

test=> SELECT myround(1.23456789);
INFO:  [1] = 1
INFO:  [2] = .
INFO:  [3] = 2
INFO:  [4] = 3
INFO:  [5] = 4
INFO:  [6] = 5
INFO:  [7] = 6
INFO:  [8] = 7
INFO:  [9] = 8
INFO:  [10] = 9
  myround
------------
 1.23456789
(1 row)

--
Michael Fuhr

Re: Implementing rounding rule in plpgsql

От
Michael Fuhr
Дата:
On Sun, Nov 20, 2005 at 02:24:20AM -0700, Michael Fuhr wrote:
> On Sun, Nov 20, 2005 at 02:01:02AM -0500, jeff sacksteder wrote:
> > Due to application requirements, I need to implement a rounding function
> > that is independant of the baked-in rounding functionality. I'd prefer to do
> > it in plpgsql for maximum portability.
> > To do this, I'll need to sequentially walk through the digits of an
> > arbritarily long floating-point number. I can't think of a good way to do
> > this.
>
> This wouldn't be a homework assignment, would it?  Anyway, maybe
> this will give you some ideas:

It occurred to me after I posted this that there might be a numerical
method for walking through the digits.  Successive multiplication by
10 has problems due to the inaccuracies of floating-point arithmetic,
although using a numeric type instead of double precision might solve
that problem.  Maybe somebody more familiar with numerical methods
than I will suggest something.

--
Michael Fuhr