2011-01-30 5 views
0

J'ai trois nombres retournés d'une base de données que j'ai besoin d'ajouter ensemble. Pour un total de 1 740,01, je reçois 10,00. Ce sont des nombres à virgule flottante. Voici les chiffres réels avec lesquels j'ai un problème.Ajouter des nombres ne donne pas les résultats attendus

> 1,729.13 
> 10.88 
> 0.00 

Comment obtenir le nombre correct de ces nombres?

EDIT

$cash = preg_replace('/\$/', '', $cash); 
$card = preg_replace('/\$/', '', $card); 
$check = preg_replace('/\$/', '', $check); 

$cash = number_format(array_sum($cash), 2); 
$card = number_format(array_sum($card), 2); 
$check = number_format(array_sum($check), 2); 
$total = number_format($cash + $card + $check, 2); 
+0

De quel type de données sont-ils dans la base de données? –

+0

Le total est de 1 740,01, au cas où vous vous poseriez la question. Si vous avez besoin de plus, il serait agréable de voir le code que vous utilisez, donc nous pouvons vous aider à le réparer. –

+0

duplication possible de [PHP Math Precision] (http://stackoverflow.com/questions/3726721/php-math-precision), [Arrondir en PHP] (http://stackoverflow.com/questions/3512663/rounding-in -php), [Comment résoudre ce problème en PHP?] (http://stackoverflow.com/questions/1995226/how-to-fix-this-problem-in-php) – outis

Répondre

2

Ne pas ajouter des valeurs qui ont été formatées à l'aide number_format(), sinon ils pourraient bien contenir, comme séparateur de mille ... ils sont traités comme des chaînes plutôt que des flotteurs .

En supposant que $ en espèces, carte $ et vérifier $ sont des tableaux:

$cash = array_sum($cash); 
$card = array_sum($card); 
$check = array_sum($check); 

$total = number_format($cash + $card + $check, 2); 

$cash = number_format($cash, 2); 
$card = number_format($card, 2); 
$check = number_format($check, 2); 

Est-ce que la mise en forme après le calcul

EDIT

Utilisez str_replace() plutôt que preg_replace() pour enlever tout $, alors c'est une addition simple plutôt que de devoir faire le array_sum(), bien que je ne sois pas sûr d'où $ est susceptible de provenir si les valeurs sont DECIMAL 10,7 de la base de données

$cash = (float) str_replace(array('$',','), '', $cash); 
$card = (float) str_replace(array('$',','), '', $card); 
$check = (float) str_replace(array('$',','), '', $check); 

$total = number_format($cash + $card + $check, 2); 

$cash = number_format($cash, 2); 
$card = number_format($card, 2); 
$check = number_format($check, 2); 

(suppose que, est votre séparateur de milliers dans les valeurs de chaîne pour $ en espèces, carte $ et vérifier $ lorsque vous faites la str_replace()

EDIT 2

Pour convertir le $ tableau en espèces à une somme de ses valeurs, après avoir nettoyé tout $ ou, dans les cordes:

$cash = array (0 => '$1729.13', 1 => '0.00', 2 => '$1,234.56'); 

function cleanArrayValues($value) { 
    return (float) str_replace(array('$',','), '', $value); 
} 

$cash = array_sum(array_map('cleanArrayValues',$cash)); 

J'ai ajouté une valeur supplémentaire dans le tableau de trésorerie de $ juste pour démontrer.

Vous aurez besoin de filtrer la carte $ et les chèques $ de la même manière, en utilisant la fonction de rappel cleanArrayValues ​​() (si elles sont tous les tableaux)

+0

Merci Mark, je viens de vous répondre ci-dessus. Les variables sont des tableaux de pref_replace. Donc vous dites que j'ai besoin d'ajouter ces nombres ensemble et que j'utilise number_format? – Jim

+0

Assurez-vous juste qu'ils sont des chiffres pas des chaînes. Un ',' dans '1,729.13' rend PHP cast le nombre entier à' 1'. – Mchl

+0

@Mchl, Merci .. – Jim

Questions connexes