我对float字段进行update.前台保存2.11,交给JDBC前print出来也是2.11,存入数据库后变成 2.119999885559082.而通过sql来操作,不会出现这种情况.UPDATE a_item_pipe SET storm_pipe_length = 2.51212出来的结果还是2.51212.说明问题出在JDBC上.我正在研读JTDS的原代码,已经1天了还没搞定,请各位帮忙.

解决方案 »

  1.   

    我不是通过拼写SQL,写入数据库的.我是通过PreparedStatement中的setFloat方法,set进去出的问题.
      

  2.   

    因为我是做项目维护,不可能将整个系统的SQL全部在写一遍,工作量很大,而且拼写SQL方式,容易导致SQL注入,不安全.所以一定要解决这个bug.
      

  3.   

    float f=2.51212;System.out.println(f);//此行输出一定不是2.51212这是浮点数本身的问题,用BigDecimal来代替float就行了ps.setObject(new BigDecimal(2.51212));
      

  4.   

    罪魁祸首:net.sourceforge.jtds.jdbc.RequestStream.java
        /**
         * Write a float value to the output stream.
         *
         * @param f The float value to write.
         * @throws IOException
         */
        void write(float f) throws IOException {
            int l = Float.floatToIntBits(f);
            write((byte) l);
            write((byte) (l >> 8));
            write((byte) (l >> 16));
            write((byte) (l >> 24));
        }
    将float转换成int,然后再转换成byte,过程中肯定会有些精度偏差.上面这段代码太底层了,不懂怎么改.
      

  5.   

    谢谢flyxxxxx(灭神) 的提示.不过要改整个项目都得做ps.setObject();干脆就在JDBC中直接做,将setFloat都转换成BigDecimal类型来处理.
      

  6.   

    OK,已修正.
    net.sourceforge.jtds.jdbc.JtdsPreparedStatement.java改成:
        setParameter(parameterIndex, new BigDecimal(new Float(x).toString()), java.sql.Types.DECIMAL, 0, 0);谢谢flyxxxxx(灭神)