Search Postgresql Archives

Re: Floating point error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Em 24/02/2013 23:26, John R Pierce escreveu:
On 2/24/2013 6:20 PM, John R Pierce wrote:
On 2/24/2013 6:13 PM, Tom Duffey wrote:
- The Java app on production shows "10.3884573" while the test app shows "10.3885"

'real' is single precision, which is only about 6 digits of decimal accuracy. if your java variables were double precision, you probably should have used double in postgres too.

0.1 decimal is a repeating fraction in binary.

ooops, missed my third point. if precise decimal numbers are important, use a decimal data type, which is NUMERIC in SQL (I'm not familiar enough with Java to know if it has a BCD or other decimal type).

Java BigDecimal is the best fit for Numeric in PostgreSQL

It requires a bit more programming effort, but is the most precise type for money work.

For instance to sum 2.00 plus 2.00 program:

public static void main(String [] args) {
BigDecimal num1 = new BigDecimal("2.00");
BigDecimal num2 = new BigDecimal("2.00");
BigDecimal sum = num1.add(num2);

if(sum.compareTo(new BigDecimal("4.00"))==0) {
  System.out.println("Matches: 2.00+2.00 == 4.00");
} else {
  System.out.println("Uau, how did you get here?");
}
}

You must use "compareTo" method to compare two values, and can't use BigDecimal "equals" to compare values, because 2.0 is different than 2.00 (scale differ)...


Regards,

Edson


--
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux