您的位置:首页 > 数据库 > Oracle

使用Oracle+Java的小心!

2007-01-10 11:04 393 查看
创建一个简单表: TABLE TEST_TABLE ,做下面的测试

public static void main(String[] args) throws Exception
{
Class.forName ("oracle.jdbc.OracleDriver");
Connection connection = null;
try
{
connection = (Connection) DriverManager.getConnection ("some_oci_url", "user", "****");
String query = "insert into test_table values (?)";
PreparedStatement stmt = connection.prepareStatement(query);
BigDecimal bd = new BigDecimal(new Double(12500000).toString());
stmt.setBigDecimal(1, bd);
stmt.execute();
}
finally
{
if(connection != null)
connection.close();
}
}

作好准备;

select * from test_table
VALUE
-----
1250000

结果少了一个零!

Oracle已经知道这个严重的BUG,并表示将在11G的时候修复(大概在2010年)

如果BigDecimal bd = new BigDecimal("12500000");则不会有问题

这个BUG的产生原因是 JDK1。4 升级到JDK5的时候,BigDecimal.toString()的实现方法重新写了。JDK5的时候它会根据需要返回科学表示法,而JDK1。4 只调用
Character.forDigit(int, int)
返回字符串,相应的方法在JDK5是BigDecimal.toPlainString()。应该说JDK5中BigDecimal.toString()的实现更科学,可是Oracle驱动不买帐。

测试:


package kompakar.tutorial.test.jdk14to5;




import java.math.BigDecimal;






/** *//**


* 测试BigDecimal.toString()


* @author wuxuefeng@kompakar.com.cn


*


*/




public class BigDecimalTest ...{






/** *//**


* @param args


*/




public static void main(String[] args) ...{




//用科学表示法创建BigDecimal


System.out.println(new Double(12500000).toString());


BigDecimal value = new BigDecimal(new Double(12500000).toString());


System.out.println(value.toString());




//用字符串创建BigDecimal


System.out.println(new BigDecimal(value.toPlainString()).toString());




//用int创建BigDecimal. int是4bytes,最大只能表示-2,147,483,648 to 2,147,483,647


System.out.println(new BigDecimal(12500000).toString());


}




}



参考:

http://www.javalobby.org/java/forums/t88158.html

http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigDecimal.html#toString()

http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#toEngineeringString()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: