2009-06-16 4 views
0

Ich habe eine Datenbank order mit price und deposit Felder auf Float-Typ festgelegt. Ich implementiere auch eine Java-GUI, um die Bestellung zu durchsuchen, das Problem ist, wenn ich versuche, nach den Bestellungen in der Datenbank zu suchen, finde ich nichts, weil es Preis = 55.0 speichert, wenn ich von String zu Float und in der Datenbank es als speichert 55. Was ist das Problem? Welchen Typ sollte ich verwenden, um Währung von den zwei Seiten, Java Seite und MySQL Seite darzustellen?Mysql Float Typ

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

}      

hier ist der Code für das Suchverfahren

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

Antwort

10

Sie mit Währungswerten mit Floating-Point zu tun sind?

Bitte nicht tun.

Floating point values kann nicht genaue Dezimalwerte darstellen, da sie binäre Brüche darstellen. Wenn Sie nicht mit Werten wie $ 1,0000000000001 enden möchten, verwenden Sie einen Datentyp, der ganzzahlig ist, z. B. einen Dezimaltyp.

Der Grund, warum Vergleich mit einem ==-Operator nicht wie vorgesehen funktioniert, ist, weil viele Zahlen, die in Dezimalzahl dargestellt werden können nicht in Fließkomma dargestellt werden kann, daher gibt es keine genaue Übereinstimmung.

Hier ist ein kleines Beispiel:

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

Ausgänge:

true 
200000.48 

Diese beiden Beispiele zeigen sollen, dass für Währung auf Gleitkommawerten unter Berufung nicht so eine gute Idee wäre.

Wie für die Speicherung von Währungswerten scheint es, dass es auch einen Typ in MySQL gibt, also würde ich denken, dass wäre eine bessere Wahl, es sei denn, es gibt CURRENCY Typ - ich bin nicht vertraut genug mit SQL-Datenbanken, um hier eine fundierte Meinung zu geben.

Hier ist eine kleine Information aus dem MySQL 5.1 Referenzhandbuch, Section 10.2: Numeric Types:

Die DECIMAL und NUMERIC Datentypen sind verwendete genaue numerische Daten Werte zu speichern. In MySQL ist NUMERIC implementiert als DECIMAL. Diese Typen werden verwendet, um Werte zu speichern, für die es wichtig ist, genaue Genauigkeit, zum Beispiel mit monetären Daten zu erhalten.

Hier ist eine weitere Frage:

+0

Sehr gute Antwort. :-) –

1

Wenn Sie Gleitkommazahlen vergleichen, müssen Sie sie immer in einem kleinen Bereich vergleichen, sagen Sie plus oder minus einen halben Cent, wenn Sie mit Währung umgehen. Wenn Sie sie mit der exakten Gleichheit vergleichen, werden Sie immer Fehler bekommen, weil Fließkomma nicht die meisten Dezimalzahlen genau darstellt.

Es ist wegen dieses Problems, dass Geld in der Regel in mySQL als DECIMAL statt Fließkomma gespeichert wird. DECIMAL leidet nicht unter denselben Ungenauigkeiten.

Verwandte Themen