PHP les nombres réels ne pas ajouter correctement - virgule manquante
Je suis en train d'essayer d'obtenir le total de mes variables contenant des nombres, certains peuvent être des décimales. J'ai besoin de cette à deux décimales, et je suis en utilisant le number_format() fonction.
$total = $order->order->net+$order->order->deductions+$order->order->vat+$order->order->postage+$order->order->postage_tax;
echo number_format((float)$total, 2, '.', '');?>
J'ai remarqué que les valeurs suivantes ne s'additionnent pas correctement et semble ignorer la virgule. Le total devrait être 118.50 mais au lieu de cela je obtenir 118.00.
100+0+17.5+1+0
J'ai fait des recherches et trouvé le ci-dessous
http://floating-point-gui.de/basic/
Je suis un peu confus par elle. Quelqu'un peut-il expliquer ce que je dois faire?
*MODIFIER
Ci-dessous est de vidage de l'ordre de $variable indiquant les nombres, je suis en train d'ajouter. Vous pouvez voir les 17,5 17,5 et pas 17. Est-ce parce qu'ils sont prescrits comme étant des chaînes peut-être?
object(SimpleXMLElement)#12 (21) { ["id"]=> string(6) "922704" ["shopkeeper_orderno"]=> string(4) "1001" ["customer"]=> string(6) "797893" ["creationdate"]=> string(16) "29-05-2012 11:55" ["net"]=> string(3) "100" ["vat"]=> string(4) "17.5" ["status"]=> string(1) "1" ["isnew"]=> string(1) "0" ["deductions"]=> string(1) "0" ["postage"]=> string(1) "1" ["paymentmethod"]=> string(20) "PayPal " ["instructions"]=> object(SimpleXMLElement)#17 (0) { } [2]=> object(SimpleXMLElement)#22 (1) { ["items"]=> object(SimpleXMLElement)#30 (9) { ["id"]=> string(7) "1384486" ["headerID"]=> string(6) "922704" ["productID"]=> string(7) "4959678" ["description"]=> string(13) "Wedding dress" ["net"]=> string(3) "100" ["vat"]=> string(4) "17.5" ["qty"]=> string(1) "1" ["formID"]=> string(2) "-1" ["options"]=> object(SimpleXMLElement)#31 (1) { ["options"]=> array(2) { [0]=> object(SimpleXMLElement)#32 (6) { ["id"]=> string(6) "519981" ["orderDetailsID"]=> string(7) "1384486" ["optionid"]=> string(6) "646934" ["optionCost"]=> string(1) "0" ["optionVAT"]=> string(1) "0" ["customText"]=> string(9) "size : 12" } [1]=> object(SimpleXMLElement)#33 (6) { ["id"]=> string(6) "519982" ["orderDetailsID"]=> string(7) "1384486" ["optionid"]=> string(6) "647285" ["optionCost"]=> string(1) "0" ["optionVAT"]=> string(1) "0" ["customText"]=> string(14) "Colour : Ivory" } } } } } } ["postage_tax"]=> string(1) "0" ["dispatched"]=> string(1) "0" ["paybyotherid"]=> string(2) "-1" ["wheredidyouhearid"]=> string(2) "-1"
}
Si vous passer le nombre des matières, travaux. L'écho de toutes les variables utilisées dans le calcul et vérifier qu'ils sont vraiment ce que vous pensez/disent qu'ils sont.
OriginalL'auteur LeeTee | 2012-06-28
Vous devez vous connecter pour publier un commentaire.
Êtes-vous sûr que votre toutes ces revendeurs à valeur ajoutée sont int ou float type?
Vérifiez le type de
si vous avez utilisé
number_format
pour ces vars ils peuvent être de chaîne, utilisez floatval().vérifier les exemples,
Résultat : int(118)
Résultat : float(118.5)
OriginalL'auteur Tufan Barış Yıldırım
vous pouvez utiliser tour et puis format de nombre:
OriginalL'auteur MilMike
Veuillez vérifier la valeur à venir pour varriable
$order->order->vat
. Je pense que ce n'est pas venue de 17,5 parce que si Nous assignons la valeur que vous attribuez à varriable et les ajouter il montre la bonne réponse.$total = $a + $b + $c + $d + $e;
echo number_format((float)$total, 2, '.', "); //118.50 (Réponse)
Ou de l'Utilisation
floatval($var)
pour arriver float valeur de la variable.J'espère qu'il aura du travail.
grâce
OriginalL'auteur Er. Anurag Jain
Si vous êtes à la recherche pour la valeur exacte sans correction ou ronde, vous devez utiliser le bcadd fonction suivante pour obtenir la réelle deux virgule
OriginalL'auteur jewelhuq
Généralement, la fonction que vous voulez pour l'arrondissement de 2dp est "ronde" et non pas "number_format".
Visiblement, dans votre écho, ils seront à la fois de faire la même chose, bien que. Ronde va définitivement régler le nombre si vous voulez faire un traitement ultérieur.
Cela dit, je ne vois pas d'erreur dans votre code, ou aucune raison de 0,5 devrait être abandonnée. Je vous suggère de vérifier que l'ordre de $->ordre->la tva est en fait 17,5 et pas 17. Si c'est le 17, puis le chasser vers l'arrière pour trouver l'endroit où vous avez integered que (par exemple dans une base de données ou dans une entrée de validation en fonction, par exemple)
OriginalL'auteur Robbie