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

PHP & Base de données Discussion :

php round nombre trop long et ajouté dans un array


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 50
    Par défaut php round nombre trop long et ajouté dans un array
    bonjour,

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $round1 = round($value[1],5);
    $round2 = round($value[0],5);
    array_push($coord_bdd,array($round1,$round2));
    echo $round1.', '.$round2.'<br />';

    résultat : 5.70564, 45.20083

    mais dans l'array, j'ai : [5.70563999999999982293275024858303368091583251953125,45.20083000000000339468897436745464801788330078125]

    pour info, ce sont des coordonnées gpx encodées issues de l'api strava.
    décodé en polyline.
    puis je transforme en json.

    je ne comprends pas la raison de ce problème

    merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 653
    Par défaut
    c'est normal, il s'agit de la façon dont sont gérés les nombres flottants en php et aussi dans d'autres langages :
    https://www.php.net/manual/fr/language.types.float.php

    avec quelle utilisation cela vous pose-t-il problème ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 50
    Par défaut
    Citation Envoyé par mathieu Voir le message
    avec quelle utilisation cela vous pose-t-il problème ?
    merci pour ta réponse mathieu.
    c'est pour "enregistrer" mes sorties à vélo en json, et cela alourit énormément et inutilement mon fichier.

    j'ai regardé ton lien mais je n'ai pas trouvé pourquoi le round ne fonctionne pas ni comment faire pour supprimer des décimales.

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 315
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 315
    Billets dans le blog
    17
    Par défaut
    Donne un exemple concret et exécutable illustrant le problème.

    Tu peux aussi utiliser sprintf('%f.5', $x)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 50
    Par défaut
    Bonjour,

    voilà mon code :

    Essai 1 : renvoi une chaine au lieu d'un nombre décimal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    $points = Array ( Array ( 45.29077, 5.63361 ), Array ( 45.29083, 5.63384 ) );
     
    	echo 'points = ';
    	print_r($points);
     
    $json_parcours = array("type"=>"FeatureCollection", "features"=>array());
    $coord_bdd = array();
     
    foreach($points as $value){
    	//echo gettype($value[1]).' : ';
    	$round1 = substr($value[1],0,7);
    	$round2 = sprintf('%f.5', $value[0]);
    	//$round1 = floatval($round1);
    	//$round2 = floatval($round2);
    	array_push($coord_bdd,array($round1,$round2));
    	//echo $round1.', '.$round2.'<br />';
     
    	echo '<br/><br/>coord_bdd = ';
    	print_r($coord_bdd);
    }
     
    array_push($json_parcours["features"],array("type"=>"Feature","geometry"=>array("type"=>"LineString","coordinates"=>$coord_bdd),"properties"=>array()));
     
    $jsonData = json_encode($json_parcours,JSON_UNESCAPED_UNICODE);		// Convertir le tableau en JSON
     
    echo '<br/><br/>jsonData = ';
    print_r($jsonData);
    Résultat :
    points = Array ( [0] => Array ( [0] => 45.29077 [1] => 5.63361 ) [1] => Array ( [0] => 45.29083 [1] => 5.63384 ) )

    coord_bdd = Array ( [0] => Array ( [0] => 5.63361 [1] => 45.290770.5 ) )

    coord_bdd = Array ( [0] => Array ( [0] => 5.63361 [1] => 45.290770.5 ) [1] => Array ( [0] => 5.63384 [1] => 45.290830.5 ) )

    jsonData = {"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"LineString","coordinates":[["5.63361","45.290770.5"],["5.63384","45.290830.5"]]},"properties":[]}]}

    Essai 2 : renvoi bien un nombre décimal comme voulu mais rajout d'énormément de décimale... avec floatval

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    $points = Array ( Array ( 45.29077, 5.63361 ), Array ( 45.29083, 5.63384 ) );
     
    	echo 'points = ';
    	print_r($points);
     
    $json_parcours = array("type"=>"FeatureCollection", "features"=>array());
    $coord_bdd = array();
     
    foreach($points as $value){
    	//echo gettype($value[1]).' : ';
    	$round1 = substr($value[1],0,7);
    	$round2 = sprintf('%f.5', $value[0]);
    	$round1 = floatval($round1);
    	$round2 = floatval($round2);
    	array_push($coord_bdd,array($round1,$round2));
    	//echo $round1.', '.$round2.'<br />';
     
    	echo '<br/><br/>coord_bdd = ';
    	print_r($coord_bdd);
    }
     
    array_push($json_parcours["features"],array("type"=>"Feature","geometry"=>array("type"=>"LineString","coordinates"=>$coord_bdd),"properties"=>array()));
     
    $jsonData = json_encode($json_parcours,JSON_UNESCAPED_UNICODE);		// Convertir le tableau en JSON
     
    echo '<br/><br/>jsonData = ';
    print_r($jsonData);
    Résultat :

    points = Array ( [0] => Array ( [0] => 45.29077 [1] => 5.63361 ) [1] => Array ( [0] => 45.29083 [1] => 5.63384 ) )

    coord_bdd = Array ( [0] => Array ( [0] => 5.63361 [1] => 45.29077 ) )

    coord_bdd = Array ( [0] => Array ( [0] => 5.63361 [1] => 45.29077 ) [1] => Array ( [0] => 5.63384 [1] => 45.29083 ) )

    jsonData = {"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"LineString","coordinates":[[5.63361000000000000653699316899292171001434326171875,45.29077000000000197132976609282195568084716796875],[5.63384000000000018104628907167352735996246337890625,45.290829999999999699866748414933681488037109375]]},"properties":[]}]}

    Encore merci !

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 653
    Par défaut
    en testant votre code avec PHP 8.1 et 7.2, je n'obtiens pas toutes ces décimales. utilisez-vous une version de php plus ancienne ?

    d'un autre côté, j'ai testé sur ce site avec PHP version 5.4 et j'ai le même résultat sans les décimales :
    https://3v4l.org/QZgUn#v5.4.0

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 50
    Par défaut
    je suis en 8.2.24.
    c'est vraiment étrange, un mystère !
    Merci pour ton retour

  8. #8
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 988
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 988
    Par défaut
    Je pense que le problème vient de la valeur du paramètre de configuration serialize_precision qui, je ne sais pas pour quelle raison obscure, est réglé à 60, alors que sur une installation standard de PHP > 7.1 il devrait être à -1. Regarde sur cette démo qui reproduit le problème.

    Pour en avoir le cœur net, je te conseille de commencer ton script par ini_set('serialize_precision', -1); pour voir si le problème disparaît.

    Si tel est le cas, alors tu peux corriger la valeur dans ton php.ini.

Discussions similaires

  1. Suppression des virgules puis ajout dans un ARRAY
    Par thekillerb313 dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2020, 21h50
  2. Comment raboter un texte trop long et ajouter 3 petits points ?
    Par djibril dans le forum Téléchargez
    Réponses: 3
    Dernier message: 06/05/2014, 16h33
  3. [XL-2003] Conversion nombre en date et ajout dans une formule
    Par clem71 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/04/2009, 10h26
  4. nombre trop long depuis une requete access
    Par db48752b dans le forum ASP
    Réponses: 5
    Dernier message: 18/11/2008, 13h49
  5. Texte trop long pour afficher dans une combobox
    Par bavmorda1 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/02/2008, 13h42

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