使用Oracle+Java的小心!


创建一个简单表: 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()

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值