2009-06-16 6 views
0

J'ai une base de données order avec les champs price et deposit réglés sur float. J'implémente aussi un java gui pour chercher la commande, le problème est quand j'essaye de chercher les commandes dans la base de données je ne trouve rien parce qu'il économise le prix = 55.0 quand je convertis de chaîne en flotteur et dans la base de données il enregistre comme 55. Quel est le problème? quel type dois-je utiliser pour représenter la devise des deux côtés, côté java et côté mysql?mysql float type

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

}      

est ici le code de la méthode de recherche

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

Répondre

10

Êtes-vous sur les devises avec des valeurs à virgule flottante?

Veuillez ne pas.

Floating point values ne peut pas représenter des valeurs décimales exactes, car elles représentent des fractions binaires. Sauf si vous voulez vous retrouver avec des valeurs telles que $ 1.0000000000001, utilisez un type de données qui est intégral, tel qu'un type décimal. La raison pour laquelle la comparaison utilisant un opérateur == ne fonctionne pas comme prévu est que de nombreux nombres pouvant être représentés en décimal ne peuvent pas être représentés en virgule flottante, par conséquent, il n'y a pas de correspondance exacte.

Voici un petit exemple:

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

Sorties:

true 
200000.48 

Ces deux exemples montrent que devraient se fondant sur des valeurs à virgule flottante pour la monnaie ne serait pas une bonne idée. En ce qui concerne le stockage des valeurs monétaires, il semble qu'il existe également un type DECIMAL dans MySQL, donc je pense que ce serait un meilleur choix, à moins qu'il y ait un type CURRENCY - je ne connais pas assez avec des bases de données SQL pour donner une opinion éclairée ici.

est ici un peu d'information du MySQL 5.1 Reference Manual, Section 10.2: Numeric Types:

Les DECIMAL et NUMERIC types de données sont utilisés pour stocker des données numériques exactes valeurs. En MySQL, NUMERIC est implémenté en tant que DECIMAL. Ces types sont utilisés pour stocker des valeurs pour lesquelles est important pour préserver la précision exacte , par exemple avec des données monétaires .

est ici une question connexe:

+0

Très bonne réponse. :-) –

1

Lorsque vous comparez des nombres à virgule flottante, vous devez toujours les comparer dans un petit intervalle, disons plus ou moins un demi-centime lorsque vous traitez avec des devises. Si vous les comparez avec l'égalité exacte, vous obtiendrez toujours des erreurs car le nombre à virgule flottante ne représente pas la plupart des nombres décimaux avec précision.

C'est à cause de ce problème que l'argent est généralement stocké dans mySql comme DECIMAL plutôt que comme virgule flottante. DECIMAL ne souffre pas des mêmes inexactitudes.