IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MySQL Discussion :

Précision des valeurs numériques calculées [MySQL-8.0]


Sujet :

MySQL

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut Précision des valeurs numériques calculées
    Bonjour,
    Je suis à la recherche d'une solution permettant de gérer de façon plus ou moins automatique la précision des résultats des opérations numériques.
    Après vérification sur le manuel MYSQL, il semble important d'utiliser le type DECIMAL pour la définition des colonnes des tables avec la précision désirée.
    Sachant cela, lorsque l'on a besoin de créer des tables temporaires dont on ne connaît pas la précision nécessaire pour les nombres qui seront insérés, y a t il un moyen de dire à MYSQL d'adapter la précision des colonnes en fonction des nombres qui sont/seront enregistrés ?

    Autre problème je cherche à obtenir la précision maximale pour certaines opérations basiques, mais je ne trouve aucune solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 
    CAST('012345678901234567890123456789012345678901234567890123456789.123456' as DECIMAL(65,4)),
    CAST('0123456789012345678901234.56789012345678901234567890123456789' as DECIMAL(65,30)),
    CAST(SQRT(3) as CHAR),
    CAST(SQRT(3) as DECIMAL(65,30))
    12345678901234567890123456789012345678901234567890123456789.1235
    123456789012345678901234.567890123456789012345678901235
    1.7320508075688772
    1.732050807568877200000000000000
    La calculette de windows me donne la valeur :

    1,7320508075688772935274463415059

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut xounet.

    Le maximum de chiffres que vous pouvez avoir est de 65.
    Vous avez une seconde contrainte, la partie décimale est au maximum de 30 chiffres.
    Il faut faire le choix de la partie entière ainsi que de la partie décimal, sachant que :
    --> PartEnt + PartDec = 65.
    --> PartDec <= 30

    Pour le calcul de la racine carré de 3, je crains que l'on ne puisse pas aller au delà des 16 décimales car les calculs en interne sont faits en double précision.

    Pour le type décimal, les calculs sont faits avec 30 chiffres après la virgule, au maximum. Un arrondi est appliqué sur la dernière décimal.

    Pour le stockage, je pense que c'est largement suffisant, mais je vous conseille de faire vos calculs autrement qu'avec les fonctions de MySql.

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Salut Artemus24,

    Merci pour ces explications.
    En effet pour du stockage le nombre de chiffres après la virgule n'est peut être pas fondamental, par contre pour les calculs en série ou en boucle c'est impératif !
    En plus il n'y a pas d'astuces qui pourraient compenser...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SQRT(3*1000000000000000000000000000000) 	SQRT(3) 	
    1732050807568877.2 	1.7320508075688772
    Avec php on peut s'en sortir bien mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ini_set('precision', 20); 
    echo sqrt(3.00000000000).PHP_EOL;
     
    ini_set('precision', 52); 
    echo sqrt(3.00000000000).PHP_EOL;

    1.7320508075688771932
    1.732050807568877193176604123436845839023590087890625
    jusqu'à 52 chiffres après la virgule ! Mais cela implique soit un arrondi de MYSQL lors d'un enregistrement vers une colonne DECIMAL(65,30), soit une conversion en texte

    Je préfèrerais que Mysql fasse les calculs...

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut xounet.

    Pourquoi avez-vous besoin d'une telle précision ?

    Citation Envoyé par xounet
    Je préfèrerais que Mysql fasse les calculs...
    Pour quelle raison ?

    Mysql est un SGBDR et n'a pas vocation à se substituer à un langage de programmation plus souple à l'usage.

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 099
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 099
    Points : 8 208
    Points
    8 208
    Billets dans le blog
    17
    Par défaut
    Si tu as besoin d'une grande précision et que tu utilises aussi PHP, voir BCMath :

    Pour les calculs mathématiques d'une grande précision, PHP fournit BCMath, qui supporte n'importe quelle précision et n'importe quelle taille de nombres jusqu'à 2147483647 (ou 0x7FFFFFFF) chiffres décimals
    https://www.php.net/manual/fr/intro.bc.php
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Merci pour vos réponses.
    Je n'ai pas une idée précise de la précision nécessaire cela dépend du nombre de calculs de leur niveau de précision, du nombre d'itérations..... Mais j'ai pu vérifier qu'avec la précision (65,30) les erreurs sont à peine décelables si l'on effectue des opérations basiques en explicitant les décimales. Je voulais déjà rester sur ce niveau de précision "presque parfait" et vérifier que cela convient bien, mais apparemment pas possible avec Mysql si l'on utilise des fonctions mathématiques (espérons que cela sera amélioré pour les prochaines versions).

    Php est une solution, mais cela rallongera très nettement le temps d'exécution et le code pour des calculs en série sur des tables entières c'est pas vraiment ce que je souhaite faire.
    17 décimales pour une partie des calculs intermédiaires c'est déjà pas trop mal je pense rester là dessus tout en essayant de faire un comparatif php vs Mysql et évaluer les écarts. A suivre...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C# 2.0] MaskedTextBox qui ne permet que des valeurs numériques
    Par Mast3rMind dans le forum Windows Forms
    Réponses: 9
    Dernier message: 01/09/2006, 10h33
  2. Meilleur type table pour stocker des valeurs numérique
    Par vodevil dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/04/2006, 20h42
  3. souci avec le format des valeurs numériques.
    Par LESOLEIL dans le forum Langage
    Réponses: 9
    Dernier message: 05/04/2006, 16h12
  4. Trier une colonne avec des valeurs numériques ou textes
    Par jfc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/02/2006, 11h15
  5. [xslt] filtrer des valeurs numériques
    Par yos dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/09/2005, 12h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo