mysql浮点类型

12 浏览
0 Comments

mysql浮点类型

我有一个数据库order,其中pricedeposit字段设置为浮点型。我还要实现一个Java GUI来搜索订单,问题是当我尝试在数据库中搜索订单时,我什么也找不到,因为当我将字符串转换为浮点数时,它保存为price=55.0,而在数据库中它保存为55。问题出在哪里?

在Java端和MySQL端应该使用什么类型来表示货币?

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {        
    try{
        //收集参数
        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();
        //创建新订单
        int row=this.customerSelectedRow;
        Order newOrder=new order(this.customerModel.dataVector.get(row),category,pattern,color,price,deposit);
        newOrder.search();           
        //刷新
        this.jDialogNewOrder.setVisible(false);
    }catch(Exception e){
         System.err.println ("错误信息:" + 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);
        //将正确的id分配给插入的客户
        this.id=i;
        System.out.println("id" + "=" + i);
    }
} catch (SQLException e) {
    System.err.println ("查找id错误信息:" + e.getMessage ());
    System.err.println ("查找id错误编号:" + e.getErrorCode ());
}

0
0 Comments

在比较浮点数时,必须始终在一个小范围内进行比较,例如在处理货币时,可以将范围设定为加减半分钱。如果使用精确相等比较,由于浮点数不能准确表示大多数十进制数,将始终出现错误。

正因为这个问题,通常在MySQL中将货币存储为DECIMAL而不是浮点数。DECIMAL不会遭受相同的不准确性。

解决方法:

将浮点数转换为DECIMAL类型,以确保精确度。

示例代码如下(使用MySQL语法):

SELECT CAST(your_float_column AS DECIMAL(10,2)) AS converted_column
FROM your_table;

以上代码将your_float_column列中的浮点数转换为具有两位小数的DECIMAL类型,并将结果存储在converted_column中。

这样,您就可以使用DECIMAL类型进行比较,而不会遇到浮点数不准确的问题。

0
0 Comments

MySQL中的float类型不适合处理浮点数形式的货币值。浮点数类型无法精确表示十进制值,因为它们是二进制分数的表示。除非你想得到类似$1.0000000000001的值,否则应该使用整数类型的数据,比如decimal类型。

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

下面是一个小例子:

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

输出结果为:

true
200000.48

这两个示例表明,依赖浮点数类型来处理货币是不明智的。

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

以下是MySQL 5.1参考手册中关于Numeric Types的一些信息:

DECIMAL和NUMERIC数据类型用于存储精确的数值数据。在MySQL中,NUMERIC被实现为DECIMAL。这些类型用于存储需要保持精确精度的值,例如货币数据。

还有一个相关的问题:

- [How do I round up currency values in Java?](https://stackoverflow.com/questions/522855)

- [What is the best way to store a money value in the database?](https://stackoverflow.com/questions/618056)

- [Representing Monetary Values in Java](https://stackoverflow.com/questions/285680)

- [What is the best datatype for currencies in MySQL?](https://stackoverflow.com/questions/248512)

- [Is a double really unsuitable for money?](https://stackoverflow.com/questions/316727)

0