[RESOLU] Un arrondi bien étrange...

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Un arrondi bien étrange...

Re: [RESOLU] Un arrondi bien étrange...

par finipe » 07 févr. 2017, 16:23

Ok. C'est quand même fourbe comme truc :D

Re: Un arrondi bien étrange...

par @rthur » 07 févr. 2017, 10:37

Je comprends bien l'origine du problème, mais étant donné que j'ai utilisé la fonction round, la valeur 16.06 n'est-elle pas "figée" pour toutes les opérations ultérieures ?
Non puisque l'origine de ce problème est la façon de stocker le float

Re: Un arrondi bien étrange...

par finipe » 07 févr. 2017, 02:04

Je comprends bien l'origine du problème, mais étant donné que j'ai utilisé la fonction round, la valeur 16.06 n'est-elle pas "figée" pour toutes les opérations ultérieures ?

Re: Un arrondi bien étrange...

par yoda_arrondi » 06 févr. 2017, 18:30

C'est un fait de l'informatique depuis ses débuts, les float sont toujours des approximations et il faut utiliser la/les fonction(s) appropriée(s) de la bonne façon pour arrondir vers la réalité illusoire voulue à défaut d'être une réalité alternée. Il faut approfondir davantage les types de données dans un language à typage faible comme PHP pour obtenir la précision désirée, j'ajoute donc un changement de précision pour rendre le tout un chouïa surnaturel.
<pre><?php
foreach(range(12, 21) as $precision) {
  ini_set('precision', $precision); // precision est un terme scientifique assez connu
  echo "precision: $precision\n";

  $float_original = 16.056;
  echo "original: $float_original\n"; // Résultat avec un exemple choisi : 16.056

  $float_1 = round($float_original, 2); // toujours un float
  echo "round(\$float_original, 2): $float_1\n";   // un cast en string a été fait par PHP en interne pour l'affichage

  $float_2 = $float_1*100;
  echo "\$float_1*100: $float_2\n"; // Tu verras que tout ne va pas bien ici... illusion... oups... précision oblige.

  $int_1 = intval($float_1*100); // cast d'un float avec perte d'illusion de précision vers int
  echo "intval(\$float_1*100): $int_1\n"; // Résultat : 1605 (????) on a perdu de l'illusion

  $int_2 = round($float_1*100); // voilà un vrai cast de float vers int en conservant l'illusion
  echo "round(\$float_1*100): $int_2\n"; // Résultat : 1606 (????) yé ! on est heureux dans un monde illusoire.
  
  $str_1 = number_format($float_1*100, 0); // c'est un cast vers string... donc on quitte les float en concervant notre illusion
  echo "number_format(\$float_1*100, 0): $str_1\n\n";
}
?></pre>
Étrange qu'aucune religion ne soit basée sur les float, car il y a toujours une infinité qui sépare 2 finalités pouvant même aller jusqu'à aucune indéfinition ! Stupéfiant notre univers il est.

Re: Un arrondi bien étrange...

par @rthur » 06 févr. 2017, 17:22

Bonjour,

Oui c'est une limitation connue qui fait même l'objet d'un encadré rouge dans la doc ici avec une explication de son origine :
http://php.net/manual/fr/language.types ... ypes.float

Re: Un arrondi bien étrange...

par finipe » 06 févr. 2017, 16:21

En revanche, quand je fais ça :

Code : Tout sélectionner

number_format($_PRIX_COMMANDE*100, 0, ".", "");
...ça m'envoie bien 1606.

Un arrondi bien étrange...

par finipe » 06 févr. 2017, 16:08

Bonjour,

Je suis confronté à une curiosité concernant un arrondi. Un peu de code, et les résultats qui vont avec :

Code : Tout sélectionner

$_PRIX_COMMANDE = floatval($row['prix']*1.2 + $row['port']); echo $_PRIX_COMMANDE; // Résultat avec un exemple choisi : 16.056 $_PRIX_COMMANDE = round($_PRIX_COMMANDE, 2); echo $_PRIX_COMMANDE; // Résultat : 16.06 $_PRIX_COMMANDE_1 = $_PRIX_COMMANDE*100; echo $_PRIX_COMMANDE_1; // Résultat : 1606 (jusqu'ici tout va bien) $_PRIX_COMMANDE_2 = intval($_PRIX_COMMANDE*100); echo $_PRIX_COMMANDE_2; // Résultat : 1605 (????)
Pourquoi le intval me change-t-il l'arrondi ? :shock: