0

I have 3 numbers returned from a database that I need to add together. For a total of 1,740.01, I get like 10.00. These are floating point numbers. Here are the actual numbers I'm having a problem with.

> 1,729.13 > 10.88 > 0.00 

How do I get the correct total of these numbers?

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 ); 
20
  • What data type are they in the database? Commented Jan 30, 2011 at 12:22
  • The total is 1,740.01, in case you're wondering. If you need more, it'd be delightful to see the code you're using, so we can help fix it. Commented Jan 30, 2011 at 12:22
  • possible duplicate of PHP Math Precision, Rounding in PHP, How to fix this problem in PHP? Commented Jan 30, 2011 at 12:23
  • Isn't 1740.01 what I have in the post? Commented Jan 30, 2011 at 12:23
  • @jim, see stackoverflow.com/posts/4842845/revisions for what happened to your original number. Commented Jan 30, 2011 at 12:28

1 Answer 1

2

Don't add values that have been formatted using number_format(), otherwise they may well contain , as a thousand's separator... they're treated as strings rather than floats.

Assuming that $cash, $card and $check are arrays:

$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 ); 

Do any formatting after the math

EDIT

Use str_replace() rather than preg_replace() to strip out any $, then it's simple addition rather than needing to do the array_sum(), though I'm not sure where any $ is likely to come from if the values are DECIMAL 10,7 from the database

$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 ); 

(assumes that , is your thousands separator in the string values for $cash, $card and $check when doing the str_replace()

EDIT 2

To convert the $cash array to a sum of its values, having cleaned up any $ or , in the strings:

$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)); 

I've added an extra value into the $cash array just to demonstrate.

You'll need to filter $card and $checks in the same way, using the cleanArrayValues() callback function (if they're all arrays)

Sign up to request clarification or add additional context in comments.

11 Comments

Thanks Mark, just answered you above. The variables are arrays from pref_replace. So you're saying that I need to add these numbers together and then use number_format?
Just make sure they're numbers not strings. A , in 1,729.13 makes PHP cast the entire number to 1.
@Mark, thanks. These are values that I'm using elsewhere in my code so I needed to strip off the dollar sign. Thanks for the edit and example. I'll give this a shot now.
Mark, are you still around? I'm having another issue.
@Jim - If it's the same problem, then edit your original post here, else raise it as another question
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.