Re: ResultSet getString() result differs in 8.3 jdbc (compared to 8.1), with "real" type

From: Guillaume Cottenceau <gc(at)mnc(dot)ch>
To: Tanel <tanel(dot)ehrenpreis(at)finestmedia(dot)ee>
Cc: pgsql-jdbc(at)postgresql(dot)org
Subject: Re: ResultSet getString() result differs in 8.3 jdbc (compared to 8.1), with "real" type
Date: 2009-05-14 16:40:56
Message-ID: 87y6szvdrb.fsf@meuh.mnc.lan
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Tanel <tanel.ehrenpreis 'at' finestmedia.ee> writes:

> Hi,
>
> I made some searches also, however found nothing exactly related to this
> problem. We just shifted from using 8.1 driver to 8.3 however seems that 8.3
> driver handles differently Postgresql floating type values, when using
> org.postgresql.jdbc2.AbstractJdbc2ResultSet.java getString() on them ?
> For example, when there is "real" type value 20.7 in database and we try to
> get it through getString() then old 8.1 driver returns nicely 20.7, but new
> 8.3 driver is returning something like 20.700001.

Wanting to manipulate precise decimal values with float or double
datatypes is bound to fail, because the binary representation of
values make it impossible - it holds the mantissa and the
exponent, so some rounding must happen. The "display" will depend
on rounding and so forth. 20.7 doesn't exist "as such" in the
computer, when using float or double datatypes.

If you want to manipulate precise decimal numbers, use the SQL
NUMERIC data type (BigDecimal in java); or else, you can always
use "fixed point" numbers, e.g. if you need a monetary value you
may store cent values as an integer (2070 in database to
represent $20.7) and shift by 100 only for user interfacing.

Beside, getString() on a floating type value is just wrong, but
you guessed it already! :)

--
Guillaume Cottenceau

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Kris Jurka 2009-05-14 18:45:11 Re: prepared statement not working
Previous Message Tanel 2009-05-14 09:10:45 ResultSet getString() result differs in 8.3 jdbc (compared to 8.1), with "real" type