2013-03-12 4 views
0

Le code suivant donne "Attention: bcdiv() [function.bcdiv]: Division by zero in ..."PHP bcdiv() division par zéro sur un grand nombre

$a = 20000000000000002; 
$b = 20000000000000004; 
echo bcdiv($a, $b); 

Pourquoi cela?

Si je mets les valeurs dans "" alors cela ne donne pas d'avertissement.

+1

Parce que la bibliothèque bcmath (http://www.php.net/manual/en/intro.bc.php) fonctionne avec des cordes; pas d'entiers qui tombent en dehors de la plage d'entiers 32 bits comme le vôtre –

+0

Essayez d'écho $ a et $ b. – sectus

Répondre

0
string bcdiv (string $left_operand , string $right_operand [, int $scale ]) 

Référence - http://www.php.net/manual/en/function.bcdiv.php

Regardez le parameters et type -

left_operand

L'opérande gauche, comme une chaîne.

right_operand

L'opérande de droite, comme une chaîne.

échelle

Ce paramètre optionnel est utilisé pour définir le nombre de chiffres après la virgule dans le résultat. Vous pouvez également définir l'échelle par défaut globale pour toutes les fonctions en utilisant bcscale().

0

Selon le docs, bcdiv prend des chaînes:

string bcdiv (string $left_operand , string $right_operand [, int $scale ]) 

Apparemment, les valeurs entières que vous fournissez sont trop grands pour ints standards PHP pour maintenir cette valeur. bcmath travaux sur cordes (qui est en fait pas si étrange):

Pour PHP mathématiques de précision arbitraire offre la calculatrice binaire qui prend en charge les numéros de toutes tailles et de précision, représentée sous forme de chaînes.

(de the bcmath intro)

1

Vous avez écrit vos numéros comme des entiers et en PHP ceux-ci sont trop élevés et sont tronqués à valeur entière max possible. BCMath fonctionne avec des chaînes. Si vous travaillez avec des chiffres aussi élevés, assurez-vous toujours de les mettre entre guillemets pour être sûr qu'ils sont vraiment des chaînes.

0

Vous étiez correct de les envelopper dans "" comme bcdiv veut les entrées sous forme de chaînes

string bcdiv (string $left_operand , string $right_operand [, int $scale ]) 

left_operand

L'opérande gauche, comme une chaîne.

right_operand

L'opérande de droite, comme une chaîne.

échelle

Ce paramètre optionnel est utilisé pour définir le nombre de chiffres après la virgule dans le résultat. Vous pouvez également définir l'échelle par défaut globale pour toutes les fonctions à l'aide de bcscale().

De http://php.net/manual/en/function.bcdiv.php