【问题标题】:mysql float typemysql 浮点型
【发布时间】:2010-11-03 05:16:24
【问题描述】:

我有一个数据库order,其中pricedeposit 字段设置为浮点类型。我还实现了一个 java gui 来搜索订单,问题是当我尝试在数据库中搜索订单时,我什么也没找到,因为当我从字符串转换为浮点数并在数据库中它保存为时,它保存了 price=55.0 55.有什么问题? 从java端和mysql端这两个端我应该用什么类型来表示货币?

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 ());

【问题讨论】:

    标签: java mysql types


    【解决方案1】:

    您正在处理具有浮点值的货币吗?

    请不要。

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

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

    这是一个小例子:

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

    输出:

    true
    200000.48
    

    这两个例子应该表明,依赖浮点值作为货币并不是一个好主意。

    至于货币值的存储,MySQL 中似乎也有一个DECIMAL 类型,所以我认为这将是一个更好的选择,除非有一些CURRENCY 类型——我是对 SQL 数据库不够熟悉,无法在此给出任何明智的意见。

    这里有一些来自 MySQL 5.1 参考手册的小信息,Section 10.2: Numeric Types

    DECIMALNUMERIC 数据类型是 用于存储精确的数字数据 价值观。在 MySQL 中,NUMERIC 是 实现为DECIMAL。这些类型 用于存储它的值 保持准确很重要 精确度,例如货币 数据。

    这是一个相关的问题:

    【讨论】:

      【解决方案2】:

      当您比较浮点数时,您必须始终在一个小范围内比较它们,例如在处理货币时正负半美分。如果将它们与完全相等进行比较,总会出错,因为浮点数不能精确地表示大多数十进制数。

      正是因为这个问题,钱在mySql中通常存储为DECIMAL而不是浮点数。 DECIMAL 不会出现同样的误差。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-08
        • 2017-06-15
        • 2011-02-03
        相关资源
        最近更新 更多