JeuWeb - Crée ton jeu par navigateur
Format d'affichage resultat division très petite - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Format d'affichage resultat division très petite (/showthread.php?tid=5296)

Pages : 1 2 3 4 5


RE: Format d'affichage resultat division très petite - Argorate - 08-03-2011

Ca met 6 ou 8 chiffre après la virgule je sais pu, enfin c'est un truc fixe aussi...
%F ne change rien non plus.


RE: Format d'affichage resultat division très petite - Ter Rowan - 08-03-2011

Si tu as vraiment besoin fonctionnellement de voir tous les chiffres
tu mets le max de décimal de ton sprintf, et après tu vires les 0 à droite dans ce cas (une sorte de right trim, mais avec des 0 au lieu des espaces)


RE: Format d'affichage resultat division très petite - Anthor - 08-03-2011


<?php
function floatToString($float)
{
$floatExtraAppend = '';
$internalPrecision = (int) ini_get('precision');
$floatExtraPrecision = (int) floor(log10(abs($float)));

$floatTotalDecimals = (int) $internalPrecision - $floatExtraPrecision;

if($floatTotalDecimals < 0)
{
$float *= pow(10, $floatTotalDecimals);
$floatExtraAppend = str_repeat('0', -$floatTotalDecimals);
$floatTotalDecimals = 0;
}

return number_format($float, $floatTotalDecimals, '.', '') . $floatExtraAppend;
}


$float= 1.7682711283366E-6;
var_dump($float); // float(1.7682711283366E-6)
var_dump( floatToString($float) ); // string(22) "0.00000176827112833660"

$float= 1.7682711283366E+26;
var_dump($float); // float(1.7682711283366E+26)
var_dump( floatToString($float) ); // string(27) "176827112833660000000000000"



RE: Format d'affichage resultat division très petite - Argorate - 08-03-2011

C'est toi qui a fait cette fonction?

Elle peut être bien pour des chiffres écrit avec la notation scientifique, mais je pense que la cheat proposé par ter rowan, peut être plus simple quand il s'agit du résultat d'une division par exemple.
Faudra que je test ça...

Merci.


RE: Format d'affichage resultat division très petite - Anthor - 08-03-2011

Tu auras beau faire ce que tu veux, tant que tu travailles avec des float, sur sprintf ou autre, tu auras la notation exponentielle.
Tu demandes une fonction qui prend un float et te retourne sa représentation en string, c'est ce que fait cette fonction.

Que veux-tu de plus ?


RE: Format d'affichage resultat division très petite - niahoo - 08-03-2011

Mais alors pourquoi tu l'appelles exponentialConv ? Ça n'a rien à voir ...

mais je n'ai pas compris l'avantage par rapport à sprintf


RE: Format d'affichage resultat division très petite - Anthor - 08-03-2011

(08-03-2011, 04:04 PM)niahoo a écrit : Mais alors pourquoi tu l'appelles exponentialConv ? Ça n'a rien à voir ...

Parce que j'avais pas que ça à faire ^^ Et que quand j'ai commencé à écrire la fonction, je pensais ne faire qu'une conversion de la notation exponentielle. Et au final elle ne fait que cela sans la représentation interne de php.

(08-03-2011, 04:04 PM)niahoo a écrit : mais je n'ai pas compris l'avantage par rapport à sprintf

Faudrait peux-être tester ta solution pour y voir le désavantage non ?


$number = 1.7682711283366E-6;
var_dump(sprintf('%f', $number)); // string(8) "0.000002"
var_dump(sprintf('%F', $number)); // string(8) "0.000002"

Citation :Floating point numbers have limited precision. Although it depends on the system, PHP typically uses the IEEE 754 double precision format, which will give a maximum relative error due to rounding in the order of 1.11e-16. Non elementary arithmetic operations may give larger errors, and, of course, error progragation must be considered when several operations are compounded.

Additionally, rational numbers that are exactly representable as floating point numbers in base 10, like 0.1 or 0.7, do not have an exact representation as floating point numbers in base 2, which is used internally, no matter the size of the mantissa. Hence, they cannot be converted into their internal binary counterparts without a small loss of precision. This can lead to confusing results: for example, floor((0.1+0.7)*10) will usually return 7 instead of the expected 8, since the internal representation will be something like 7.9999999999999991118....

So never trust floating number results to the last digit, and never compare floating point numbers for equality. If higher precision is necessary, the arbitrary precision math functions and gmp functions are available.
http://php.net/manual/en/language.types.float.php


RE: Format d'affichage resultat division très petite - niahoo - 08-03-2011

ben j'ai testé, il faut juste indiquer la précision que tu souhaite, en dur ou avec une variable.
Code :
<?php
$number = 1.7682711283366E-6;
var_dump(sprintf('%.15f', $number)); // string(17) "0.000001768271128"
var_dump(sprintf('%F', $number)); // string(8) "0.000002"

bon, à part ça, il me semble que « notation exponentielle » n'est pas le bon terme ici, c'est pour ça que je réagis, mais il me semble que l'exponentielle c'est la notation e^X et non pas x*10^y, avec la constante 'e' donc.

mais bon, avant de poster je viens de checker sur le net, c'est pas très clair leur histoire.


bon et je vois que tu me cites la doc, en fait ta fonction résout le problème de précision en réajustant le nombre ?


RE: Format d'affichage resultat division très petite - Anthor - 08-03-2011

(08-03-2011, 04:59 PM)niahoo a écrit : ben j'ai testé, il faut juste indiquer la précision que tu souhaite, en dur ou avec une variable.
Code :
<?php
$number = 1.7682711283366E-6;
var_dump(sprintf('%.15f', $number)); // string(17) "0.000001768271128"
var_dump(sprintf('%F', $number)); // string(8) "0.000002"

bon, à part ça, il me semble que « notation exponentielle » n'est pas le bon terme ici, c'est pour ça que je réagis, mais il me semble que l'exponentielle c'est la notation e^X et non pas x*10^y, avec la constante 'e' donc.

mais bon, avant de poster je viens de checker sur le net, c'est pas très clair leur histoire.

Argorate a bien indiqué qu'il ne connaissait pas la précision voulue à l'avance ^^

Pour la notation il ne faut pas confondre la fonction exponentielle (http://fr.wikipedia.org/wiki/Fonction_exponentielle) et l'exponentielle de base a (http://fr.wikipedia.org/wiki/Exponentielle_de_base_a), les deux étant liées d'ailleurs.
L'important ici c'est que la fonction fonctionne toute seule, et fait ce que demande Argorate.


RE: Format d'affichage resultat division très petite - Ieyasu - 08-03-2011

Et bien créé une petite fonction qui définit le nombre de décimal à conserver... non?

Genre


<?php
function afficher_decimal($nombre_initial)
{
$nombre_string = (string) $nombre_initial;
$tableau_fragment = explode('E-',$nombre_string );
$nbr_decimal = strlen( $tableau_fragment[0] ) + (int) $tableau_fragment[1] ;
return sprintf('%.'.$nbr_decimal.'f', $nombre_initial);
}
?>

C'est pas trop trop "crade" et assez dans la veine de ce que tu recherches non?