mysql浮点类型
mysql浮点类型
我有一个数据库order
,其中price
和deposit
字段设置为浮点型。我还要实现一个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 ()); }
在比较浮点数时,必须始终在一个小范围内进行比较,例如在处理货币时,可以将范围设定为加减半分钱。如果使用精确相等比较,由于浮点数不能准确表示大多数十进制数,将始终出现错误。
正因为这个问题,通常在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类型进行比较,而不会遇到浮点数不准确的问题。
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)