Sometimes 7 and 8 are equal.
Back in college I had a professor who would dock off points every time he saw the word float in our code. He never really told us why, but from then on we all started using double any time we needed a decimal.
It’s been a few years since college, but I think I’m finally closer to understanding what he meant. Take a look at the following PHP code. What do you think it does?
echo (int) ((.1 + .7) * 10);
It’s a basic PHP math operation. It should add .1 and .7 to get .8, then multiply that by 10 to yield 8 right?
Not so fast, what’s that (int) doing?
For those of you unfamiliar with PHP, it’s a dynamicaly typed language. That means unlike c++, you don’t have to declare a type when you declare a variable. PHP will look at how you’re using it and decide what you meant.
The (int) is a cast. It tells PHP to take whatever that result is and make sure it’s an integer. It’s very seldom used, but there are a few examples I can think of where it’s a good idea to cast your variables. I’ll save that for a later column though.
Anyway, run the above code. What happens? Do you see 8? No! It outputs 7!!
Take the (int) cast away though, and you’ll see your expected result.
So what’s going on here? The simple answer is that it has something to do with the way PHP handles floating point numbers. The long answer is, it’s the reason why the data from one of my applications never added up correctly.
February 20th, 2007