BUG #15925: Loss of precision converting money to numeric

The Post Office <noreply@postgresql.org>

From: PG Bug reporting form <noreply@postgresql.org>
To: pgsql-bugs@lists.postgresql.org
Cc: slawomir.chodnicki@gmail.com
Date: 2019-07-26T07:39:17Z
Lists: pgsql-bugs
The following bug has been logged on the website:

Bug reference:      15925
Logged by:          Slawomir Chodnicki
Email address:      slawomir.chodnicki@gmail.com
PostgreSQL version: 11.4
Operating system:   Linux
Description:        

As per documentation converting a money value to numeric does not lose
precision. In general that is the case:

select '8547758.07'::money, '8547758.07'::money::numeric(30,2);

money        |numeric   |
-------------|----------|
$8,547,758.07|8547758.07|

During my testing I found unexpected results for the min and max value of
the money type.

select '-92233720368547758.08'::money,
'-92233720368547758.08'::money::numeric(30,2);

money                      |numeric              |
---------------------------|---------------------|
-$92,233,720,368,547,758.08|-92233720368547758.00|

Note that the cent value is gone after converting to numeric.

Same issue for the max value:

money                     |numeric             |
--------------------------|--------------------|
$92,233,720,368,547,758.07|92233720368547758.00|

Best Wishes
Slawo

Commits

  1. Fix loss of fractional digits for large values in cash_numeric().