By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
431,919 Members | 1,625 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 431,919 IT Pros & Developers. It's quick & easy.

Value greater than value issue

P: n/a
Hello,

I know this will be an easy fix--but as of now I'm banging my head
against the wall. I need a fresh perspective from the group to see
what my problem is:

This is a simple accounting application, and the code below is
checking to see if a user's withdraw request is greater than their
available balance:
$withdraw_request = $_REQUEST['withdraw_amount']; // 543.21
$withdraw_maximum = $user['available_balance']; // 543.21

if($withdraw_request $withdraw_maximum) {
echo "Insufficient funds.";
} else {
echo "Processing...";
}
In my application, both values are equal (543.21), but
$withdraw_request $widthdraw_maximum still evaluates to TRUE, and
thus shows "Insufficient funds." If the two values are whole numbers,
like "543", then they evaluate the way I expect them to.

I've tried everything I can think of, like

$withdraw_request = floatval($_REQUEST['withdraw_amount']);
$withdraw_maximum = floatval($user['available_balance']);

as well as doing an "isnumeric" check on both values (they both return
true), but still no luck. If $withdraw_request is less than (<) the
$withdraw_maximum--ie 543.20 < 543.21, the script works fine.

Also, if I hard code the values, the script works fine. Somewhere
between pulling the maximum from the database and getting the
$_REQUEST variable things are getting lost in translation.

Thanks for any advice
Dec 7 '07 #1
Share this Question
Share on Google+
6 Replies


P: n/a
Acrobatic <jb****@gmail.comwrote in news:7bc09fbf-5b53-4d5d-bfc7-
32**********@d21g2000prf.googlegroups.com:

Also, if I hard code the values, the script works fine. Somewhere
between pulling the maximum from the database and getting the
$_REQUEST variable things are getting lost in translation.

Thanks for any advice
my quick suggestion would be to make sure your values really are what you
think they are... echo out to the screen

also, note that "floatval" is a function whereas "float" will evaluate a
string numerically.

so...

<?php

$withdraw_request = (float)$_REQUEST['withdraw_amount'];
$withdraw_maximum = (float)$user['available_balance'];

echo "comparing $withdraw_request and $withdraw_maximum <br>";

if($withdraw_request $withdraw_maximum) {
echo "Insufficient funds.";
} else {
echo "Processing...";
}

?>
Dec 7 '07 #2

P: n/a
Acrobatic wrote:
Hello,

I know this will be an easy fix--but as of now I'm banging my head
against the wall. I need a fresh perspective from the group to see
what my problem is:

This is a simple accounting application, and the code below is
checking to see if a user's withdraw request is greater than their
available balance:
$withdraw_request = $_REQUEST['withdraw_amount']; // 543.21
$withdraw_maximum = $user['available_balance']; // 543.21

if($withdraw_request $withdraw_maximum) {
echo "Insufficient funds.";
} else {
echo "Processing...";
}
In my application, both values are equal (543.21), but
$withdraw_request $widthdraw_maximum still evaluates to TRUE, and
thus shows "Insufficient funds." If the two values are whole numbers,
like "543", then they evaluate the way I expect them to.

I've tried everything I can think of, like

$withdraw_request = floatval($_REQUEST['withdraw_amount']);
$withdraw_maximum = floatval($user['available_balance']);

as well as doing an "isnumeric" check on both values (they both return
true), but still no luck. If $withdraw_request is less than (<) the
$withdraw_maximum--ie 543.20 < 543.21, the script works fine.

Also, if I hard code the values, the script works fine. Somewhere
between pulling the maximum from the database and getting the
$_REQUEST variable things are getting lost in translation.

Thanks for any advice
Welcome to the world of floating point numbers - where values are not
generally exact.

See http://www.php.net/manual/en/language.types.float.php for a
discussion on it.

For this particular instance, you should be able to solve the problem with:

$val1=(intval)((floatval($_REQUEST['withdraw_amount']) + 0.005)* 100);

This gets the float value, adds 0.005 to it then multiplies by 100. It
then gets the integer value of the result. Repeat for the available
balance.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================

Dec 7 '07 #3

P: n/a
For this particular instance, you should be able to solve the problem with:
>
$val1=(intval)((floatval($_REQUEST['withdraw_amount']) + 0.005)* 100);

This gets the float value, adds 0.005 to it then multiplies by 100. It
then gets the integer value of the result. Repeat for the available
balance.
Thanks guys for the advice. Jerry, your workaround did the trick.
Dec 7 '07 #4

P: n/a
Acrobatic wrote:
This is a simple accounting application, and the code below is checking
to see if a user's withdraw request is greater than their available
balance:
To build on Jerry's post, floats are a really bad idea for representing
currencies. They're just too woolly. As PHP doesn't include any fixed-
precision decimal data type, the best option is to represent money as an
integer -- using the smallest unit of currency possible (e.g. cents
rather than euros; pence rather than pounds).

You then reformat it as a price in the larger unit of currency only when
it needs to be displayed.

--
Toby A Inkster BSc (Hons) ARCS
[Geek of HTML/SQL/Perl/PHP/Python/Apache/Linux]
[OS: Linux 2.6.17.14-mm-desktop-9mdvsmp, up 21:23.]

Sharing Music with Apple iTunes
http://tobyinkster.co.uk/blog/2007/1...tunes-sharing/
Dec 8 '07 #5

P: n/a
On Dec 8, 5:51 am, Toby A Inkster <usenet200...@tobyinkster.co.uk>
wrote:
Acrobatic wrote:
This is a simple accounting application, and the code below is checking
to see if a user's withdraw request is greater than their available
balance:

To build on Jerry's post, floats are a really bad idea for representing
currencies. They're just too woolly. As PHP doesn't include any fixed-
precision decimal data type, the best option is to represent money as an
integer -- using the smallest unit of currency possible (e.g. cents
rather than euros; pence rather than pounds).

You then reformat it as a price in the larger unit of currency only when
it needs to be displayed.

--
Toby A Inkster BSc (Hons) ARCS
[Geek of HTML/SQL/Perl/PHP/Python/Apache/Linux]
[OS: Linux 2.6.17.14-mm-desktop-9mdvsmp, up 21:23.]

Sharing Music with Apple iTunes
http://tobyinkster.co.uk/blog/2007/1...tunes-sharing/
Geez, that must have been a doozey bug. :)
Dec 9 '07 #6

P: n/a
allain wrote:
On Dec 8, 5:51 am, Toby A Inkster <usenet200...@tobyinkster.co.uk>
wrote:
>Acrobatic wrote:
>>This is a simple accounting application, and the code below is checking
to see if a user's withdraw request is greater than their available
balance:
To build on Jerry's post, floats are a really bad idea for representing
currencies. They're just too woolly. As PHP doesn't include any fixed-
precision decimal data type, the best option is to represent money as an
integer -- using the smallest unit of currency possible (e.g. cents
rather than euros; pence rather than pounds).

You then reformat it as a price in the larger unit of currency only when
it needs to be displayed.

--
Toby A Inkster BSc (Hons) ARCS
[Geek of HTML/SQL/Perl/PHP/Python/Apache/Linux]
[OS: Linux 2.6.17.14-mm-desktop-9mdvsmp, up 21:23.]

Sharing Music with Apple iTunes
http://tobyinkster.co.uk/blog/2007/1...tunes-sharing/

Geez, that must have been a doozey bug. :)
Not at all. A very common bug for anyone who's worked with floating
point values for more than six months or so.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================

Dec 10 '07 #7

This discussion thread is closed

Replies have been disabled for this discussion.