Hi Carlos,

As Michael says, you risk losing precision when you switch between inexact and exact numeric datatypes. According to the JDBC spec, BigDecimal is the Java datatype which corresponds with the SQL NUMERIC/DECIMAL datatype. The following scrap of Java code

System.out.println( "11.11F as double " + (new BigDecimal( 11.11F)).doubleValue() ); System.out.println( "11.11F as float " + (new BigDecimal( 11.11F)).floatValue() ); System.out.println( "11.11F as string " + (new BigDecimal( 11.11F)) );

produces the following output:

11.11F as double 11.109999656677246
11.11F as float 11.11
11.11F as string 11.10999965667724609375

In contrast, the following scrap of Java code

System.out.println( "'11.11' as double " + (new BigDecimal( "11.11")).doubleValue() ); System.out.println( "'11.11' as float " + (new BigDecimal( "11.11")).floatValue() ); System.out.println( "'11.11' as string " + (new BigDecimal( "11.11")) );

produces the following output:

'11.11' as double 11.11
'11.11' as float 11.11
'11.11' as string 11.11

I recommend that you use the PreparedStatement.setBigDecimal() and ResultSet.getBigDecimal() methods when storing and retrieving exact numeric values.

Hope this helps,
-Rick

Carlos Eduardo Santin wrote:
Hi everybody,
Have someone had a problem like this one before? If I have a simple table like: create table test(id integer, percent numeric(5,2)) And I use a java code to insert data into this table: ////////////////////////////////////////////////////////////////////////////////
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class TestJavaDB{ public TestJavaDB(){
  try{
   executeTest();
  } catch (SQLException e){
   e.printStackTrace();
  }
 }
public void executeTest() throws SQLException{ Connection conn = DriverManager.getConnection("jdbc:derby:C:/Derby20090108/data/", "root", "root"); Float fltValue = 11.11F; String strQuery = "INSERT INTO test VALUES (?, ?)"; PreparedStatement pstmt = conn.prepareStatement(strQuery);
  pstmt.setInt(1,new Integer(2));
  pstmt.setFloat(2,fltValue);
pstmt.executeUpdate(); pstmt.close();
  conn.close();
 }
public static void main(String[] args){
  new TestJavaDB();
 }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// The value inserted into the field percent in the database is 11.10 and not 11.11 as it would be. But if I insert this data directly in the database using a script: INSERT INTO test VALUES (1, 11.11); The value appears correctly. Is there any bug related to the derby jdbc library?? Thanks in advance,
Carlos

Reply via email to