2009-07-22 4 views
4

Je stocke des valeurs dans une colonne définie comme float. Lorsque je relis ces valeurs de la base de données, elles diffèrent parfois beaucoup plus des valeurs d'origine que je ne le pensais (je sais que float ne stocke pas les valeurs exactes, jetez un oeil à l'exemple pour voir ce que je veux dire).Quelles sont les règles utilisées par MySQL pour afficher les valeurs flottantes?

Voici mon cas de test:

drop table if exists float_test; 
create table float_test (value1 float(8, 3), value2 float); 
insert into float_test values (11743.85, 11743.85); 
select mt.*, round(mt.value1, 6), round(mt.value2, 6) from float_test mt; 

Les résultats de la sélection sont les suivants:

mysql> select mt.*, round(mt.value1, 6), round(mt.value2, 6) from float_test mt; 
+-----------+---------+---------------------+---------------------+ 
| value1 | value2 | round(mt.value1, 6) | round(mt.value2, 6) | 
+-----------+---------+---------------------+---------------------+ 
| 11743.850 | 11743.8 |  11743.849609 |  11743.849609 | 
+-----------+---------+---------------------+---------------------+ 
1 row in set (0.01 sec) 

Comme vous pouvez le voir, la sélection des résultats valeur2 à 11743,8 alors que la sélection ronde (valeur2, 6) se traduit par une valeur qui est beaucoup plus proche de celle que j'ai mise à l'origine. Aussi, si vous

vous pouvez voir t Les valeurs stockées dans value1 et value2 sont effectivement égales. Donc je pense que c'est juste une question de comment les résultats sont affichés. En parcourant la documentation de MySQL, je n'ai trouvé aucune règle indiquant comment les valeurs flottantes sont arrondies automatiquement pour l'affichage.
Maintenant, j'ai des questions tow:
1. Quelles sont les règles que mysql utilise pour afficher les valeurs flottantes?
2. Existe-t-il un moyen (par exemple, certaines options de configuration) de récupérer la valeur qui n'est pas arrondie à la première décimale sans modifier ma définition de table et sans modifier mon instruction select? J'ai testé cela sur MySQL 4.0, 5.0 et 5.1.

Merci,
Stefan

Répondre

0

Cela ne répond pas complètement à ma question, mais a résolu le problème pour moi que j'utilise jdbc pour se connecter à la base de données:
obtenir les résultats souhaités lors de l'utilisation PreparedStatements au lieu des états ordinaires.
code:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class JDBCTest { 
    private static final String URL = "jdbc:mysql://sp101ap0006:3306/lvs_server_38080"; 
    private static final String USER = "user"; 
    private static final String PASSWD = "abc"; 

    private static void executeQuery(Connection connection) throws SQLException { 
     Statement statement = connection.createStatement();   
     ResultSet queryResult = statement.executeQuery("select * from float_test"); 
     queryResult.first(); 
     System.out.println(queryResult.getFloat(1) + " - " + queryResult.getFloat(2)); 
    } 

    private static void executePreparedQuery(Connection connection) throws SQLException { 
     PreparedStatement statement = connection.prepareStatement("select * from float_test"); 
     ResultSet queryResult = statement.executeQuery(); 
     queryResult.first(); 
     System.out.println(queryResult.getFloat(1) + " - " + queryResult.getFloat(2)); 
    } 

    public static void main(String[] args) { 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection connection = DriverManager.getConnection(URL, USER, PASSWD); 
      executeQuery(connection); 
      executePreparedQuery(connection); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

donne les résultats suivants:

11743.85 - 11743.8 
11743.85 - 11743.85 
4

Si vous souhaitez conserver une précision de 2 chiffres après la virgule, vous devriez probablement créer explicitement le champ comme flotteur (M, D) où D = 2 (précision) et M = le nombre de chiffres souhaité au total. La définition du champ flottant (8,2) par exemple, donnerait probablement ce que vous vouliez. Il est important de garder à l'esprit que float et double sont utilisés pour stocker des valeurs approximatives dans MySQL ... Il vaut mieux utiliser le type de données DECIMAL ... par exemple, DECIMAL (8,3).

Faites attention.

Questions connexes