mysql float type
我有一个数据库
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 | true 200000.48 |
这两个例子应该表明,依靠货币的浮点值并不是一个好主意。
至于货币值的存储,MySQL中似乎也有一个
以下是MySQL5.1参考手册第10.2节:数字类型中的一些信息:
The
DECIMAL andNUMERIC data types are
used to store exact numeric data
values. In MySQL,NUMERIC is
implemented asDECIMAL . 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中。十进制不存在同样的错误。