关于java:mysql float类型

mysql float type

我有一个数据库order,其中pricedeposit字段设置为float类型。我还实现了一个Java GUI来搜索订单,问题是当我试图搜索数据库中的订单时,我找不到任何东西,因为当我从字符串转换为浮点时,它节省了价格=55,而在数据库中保存的价格为55。有什么问题?我应该用哪种类型来表示来自Java Java和MySQL两方的货币?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 ());
    }

}

这是搜索方法的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 ());


你是在用浮点值处理货币吗?

请不要这样。

浮点值不能表示精确的十进制值,因为它们表示二进制小数。除非您希望以$1.000000000001之类的值结尾,否则请使用整型数据类型,例如十进制类型。

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

下面是一个小例子:

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

输出:

1
2
true
200000.48

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

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

以下是MySQL5.1参考手册第10.2节:数字类型中的一些信息:

The DECIMAL and NUMERIC data types are
used to store exact numeric data
values. In MySQL, NUMERIC is
implemented as DECIMAL. These types
are used to store values for which it
is important to preserve exact
precision, for example with monetary
data.

这是一个相关的问题:

  • 如何在Java中汇总货币值?
  • 在数据库中存储货币价值的最佳方法是什么?
  • 用Java表示货币价值
  • 在MySQL中,货币的最佳数据类型是什么?
  • 双人间真的不适合用钱吗?


当你比较浮点数时,你必须总是在一个小范围内比较它们,比如说在处理货币时加上或减去半个便士。如果将它们与完全相等的数进行比较,则总是会出错,因为浮点数不能精确地表示大多数十进制数。

正是由于这个问题,钱通常以十进制而不是浮点的形式存储在MySQL中。十进制不存在同样的错误。