2009-06-16 48 views
0

我有一个数据库orderpricedeposit字段设置为浮动类型。我也正在实施一个Java gui来搜索订单,问题是当我尝试搜索数据库中的订单时,我没有找到任何东西,因为当我从字符串转换为浮点数并将其保存为数据库时,它节省了价格= 55.0 55.问题是什么? 我应该用什么类型来表示货币从双方,java方面和MySQL方面?mysql float type

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {   
    try{ 
     //collect arguments 
     String category = this.jTextField8.getText(); 
     String pattern=this.jTextArea1.getText(); 
     String color=this.jTextArea2.getText(); 
     float price = Float.valueOf(this.jTextField14.getText()).floatValue(); 
     float deposit = Float.valueOf(this.jTextField15.getText()).floatValue(); 

     //create new order 
     int row=this.customerSelectedRow; 
     Order newOrder=new order(this.customerModel.dataVector.get(row),category,pattern,color,price,deposit); 
     newOrder.search();   
     //refresh 
     this.jDialogNewOrder.setVisible(false); 

    }catch(Exception e){ 
     System.err.println (" Error message: " + e.getMessage()); 
    } 

}      

这里是关于搜索方法

try { 
       s = c.conn.prepareStatement("SELECT id FROM `"+this.table+ 
         "` WHERE customerId=? AND category=? and pattern=? and color=? and deposit=? and price=?"); 
       s.setInt(1,this.customer.getId()); 
       s.setString (2, this.category); 
       s.setString (3, this.pattern); 
       s.setString (4, this.color); 
       s.setFloat(5,this.deposit); 
       s.setFloat(6,this.price); 
       System.err.println(s.toString()); 
       ResultSet res = s.executeQuery(); 

       System.out.println("printing ids :"); 
       while (res.next()) { 
        int i = res.getInt(1); 
        //assigning the correct id to the inserted customer 
        this.id=i; 
        System.out.println("id" + "=" + i); 
       } 
      } catch (SQLException e) { 
       System.err.println ("find id Error message: " + e.getMessage()); 
       System.err.println ("find id Error number: " + e.getErrorCode()); 

回答

10

你处理货币与浮点值的代码?

请不要。

Floating point values不能表示精确的十进制值,因为它们是二进制分数的表示。除非您想以$ 1.0000000000001之类的值结尾,否则请使用不可或缺的数据类型,例如十进制类型。

使用==运算符进行比较的原因不能按预期工作是因为许多可用十进制表示的数字不能用浮点数表示,因此没有精确匹配。

这里有一个小例子:

System.out.println(1.00000001f == 1.00000002f); 
System.out.println(200000.99f - 0.50f); 

输出:

true 
200000.48 

这两个例子应该表明,依靠浮点值的货币不会是一个好主意。

至于货币值的存储,似乎有一种DECIMAL型在MySQL一样,所以我认为这将是一个更好的选择,除非有一些CURRENCY类型 - 我不熟悉不够用SQL数据库在这里给出任何知情的意见。

下面是从MySQL 5.1参考手册一点点信息,Section 10.2: Numeric Types

DECIMALNUMERIC数据类型是用于存储精确数值数据 值 。在MySQL中,NUMERIC是 ,实现为DECIMAL。这些类型 用于存储其重要的值,以保留精确的 精确度,例如使用货币 数据。

这里有一个相关的问题:

+0

非常好的答案。 :-) – 2009-12-03 15:20:19

1

当您比较浮点数时,您必须始终在小范围内比较它们,例如在处理货币时加上或减去半个便士。如果您将它们与精确相等进行比较,您将始终得到错误,因为浮点不能精确地表示大多数小数。

这是因为这个问题,钱通常以十进制格式存储在mySql中,而不是浮点数。 DECIMAL不会遭受相同的不准确。