Question

Je ne peux toujours pas obtenir des résultats précis. Quel est le max. quantité de décimales je devrais afficher si je veux qu'il soit aussi précis que possible?

Certains code (prêt à être testé et collé copie):

// Test with 5 decimals 
$a = 0.00001;
echo bcadd($a,$a,5) . '<br/>';
echo bcadd($a,$a,6) . '<br/>';
echo number_format(bcadd($a,$a,5),5) . '<br/>';
echo number_format(bcadd($a,$a,5),6) . '<br/>';
echo bcadd(0.00001,0.00001,20) . '<br/>';
echo number_format(bcadd($a,$a,20),5) . '<br/>';
echo number_format(bcadd($a,$a,20),21) . '<br/><br/>';

/* Output:
0.00000
0.000000
0.00000
0.000000
0.00000000000000000000
0.00000
0.000000000000000000000
*/

// Test with 4 decimals
$a = 0.0001;
echo bcadd($a,$a,5) . '<br/>';
echo bcadd($a,$a,6) . '<br/>';
echo number_format(bcadd($a,$a,5),5) . '<br/>';
echo number_format(bcadd($a,$a,5),6) . '<br/>';
echo bcadd(0.00001,0.00001,20) . '<br/>'; // wtf? this outputs 0 too?
echo number_format(bcadd($a,$a,20),5) . '<br/>';
echo number_format(bcadd($a,$a,20),21) . '<br/>';

/* Output:
0.00020
0.000200
0.00020
0.000200
0.00000000000000000000
0.00020
0.000200000000000000010
*/

déduisent Devrais-je que la réponse est 4 ??? Mais il me reste un problème dans la ligne avec un commentaire

Edit: Je ne pense pas que quelqu'un a compris mes tests. Je sais que les flotteurs sont inexactes. Mais une chose est 1! = 0,98990123, et autre chose est 1! = 0,0000. Si je mets 4 comme la précision dans la fonction bc *, je compte obtenir au moins 0,9899 (si la réponse parfaite étaient 1), non 0.0000. Une chose est « pas parfaitement précis pour une précision infinie », autre chose est « complètement inutile ».

Edit 2: @ Michael Borgwardt a la solution

Était-ce utile?

La solution

Une cause majeure de votre problème est que vous utilisez littéraux flotteur. Cela provoque une erreur d'arrondi lorsque le code est compilé ou interprété et converti en un fraction binaire .

A ce moment-là, vous avez déjà perdu - en utilisant les fonctions mathématiques bc ne sera pas d'aide. Pour utiliser les correctement, vous devez utiliser littéraux de chaîne:

echo bcadd('0.00001','0.00001',20);

affichera:

0.00002000000000000000

Autres conseils

  

Quel est le max. quantité de décimales je devrais afficher si je veux qu'il soit aussi précis que possible?

Votre problème commence à essayer d'obtenir des valeurs précises des calculs en virgule flottante. Vous ne pouvez pas obtenir en général des valeurs précises des calculs à virgule flottante en raison d'erreurs de représentation. La valeur 0,0001 ne peut pas être représenté exactement en virgule flottante binaire de sorte que la valeur réelle stockée diffère légèrement de 0,0001 et que vous donne déjà une inexactitude. Vous devez vous attendre à ce que les chiffres les moins significatifs seront inexacts. Affichage plus décimaux ne rend pas votre calcul plus précis -. Il est tout simplement les inexactitudes inhérentes plus visibles

Si vous avez besoin de précision, vous devez soit utiliser un autre type de données (bcadd n'accepte les chaînes, mais la conversion d'un flotteur à une chaîne peut encore introduire une inexactitude) ou modifier votre programme pour permettre des réponses légèrement différentes de la réponse précise.

Si vous voulez juste afficher une réponse utile, vous pouvez l'afficher à la précision qui fait sens pour votre application. Si vous calculez la température pour régler un four pour cuire une dinde puis arrondir la réponse à deux ou trois chiffres significatifs devraient être bien. Si vous faites des calculs scientifiques vous pouvez afficher des réponses avec 3, 4 ou plus de chiffres significatifs. Si vous avez besoin d'une précision de 100% alors vous devez repenser votre conception.

"bcadd" nécessite trois arguments. Les deux premiers sont des chaînes représentant la gauche et opérandes droite et un nombre entier représentant les décimales dans le résultat. Cette fonction affiche une chaîne. Essayez d'utiliser une valeur de chaîne au lieu d'entiers dans votre écho cinquième résultat.

En outre, en ce qui concerne la précision des nombres à virgule flottante (à partir PHP.net):

La taille d'un flotteur est dépendant de la plate-forme, bien qu'un maximum de ~ 1.8e308 avec une précision d'environ 14 chiffres décimaux est une valeur commune (64 bit format IEEE).

Essayez d'utiliser la bibliothèque BCMath. Il stocke essentiellement le nombre comme une chaîne, mais vous permet de faire de l'arithmétique à elle.

Manipulation très grands ou très petits nombres

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top