Re: Incorrect rounding of double values at max precision

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Gilleain Torrance <Gilleain(dot)Torrance(at)alfasystems(dot)com>
Cc: "pgsql-bugs(at)lists(dot)postgresql(dot)org" <pgsql-bugs(at)lists(dot)postgresql(dot)org>, Andrew Gierth <andrew(at)tao11(dot)riddles(dot)org(dot)uk>
Subject: Re: Incorrect rounding of double values at max precision
Date: 2019-10-21 19:42:37
Message-ID: 5045.1571686957@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Gilleain Torrance <Gilleain(dot)Torrance(at)alfasystems(dot)com> writes:
> When storing a double in Postgres, it looks like under specific circumstances it can get rounded incorrectly:

> select round(cast(float8 '42258656681.38498' as numeric), 2), round(numeric '42258656681.38498', 2);

> which returns either 42258656681.38 or 42258656681.39 depending on whether it is float8 or not.

I think this is behaving as expected. float8-to-numeric conversion
rounds the float8 to 15 (DBL_DIG) decimal places, since that's as much
precision as you're guaranteed to have. So what comes out of the cast
is

regression=# select cast(float8 '42258656681.38498' as numeric);
numeric
-----------------
42258656681.385
(1 row)

and then that rounds up to 42258656681.39. In the other case you
have an exact numeric value of 42258656681.38498, so it's unsurprisingly
rounded to 42258656681.38.

You could quibble about whether numeric round() ought to apply
round-up or round-to-nearest-even when dealing with exact halfway
cases. If it did the latter, this particular case would match up,
but other cases would not, so I don't think it's a helpful proposal
for this issue.

The other thing we could conceivably do is ask sprintf for more digits.
But since those extra digit(s) aren't fully precise, I'm afraid that
would likewise introduce as many oddities as it fixes. Still, it's
somewhat interesting to wonder whether applying the Ryu algorithm
would produce better or worse results on average.

regards, tom lane

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Andrew Gierth 2019-10-21 22:26:53 Re: Incorrect rounding of double values at max precision
Previous Message Tom Lane 2019-10-21 15:00:56 Re: BUG #16071: Server crashes when 'numeric' data type is used on any plpython Function