I wrote the following C++ code:
float a, b;
int c;
a = 8.6;
b = 1.4;
c = a + b;
printf(\"%d\\n\", c);
The output is 10
.
There is no such number as 8.7 or 1.3 in floating point. There is a number 10, and a number -6.5, and a number 0.96044921875... but no 8.7 or 1.3.
At best, your computer can round 8.7 to the nearest floating point number, and round 1.3 to the nearest floating point number as well. The computer adds these rounded numbers to each other, and then rounds the result.
Do not use floating point numbers for money.
#include <stdio.h>
int main(int argc, char *argv[])
{
float a = 8.7, b = 1.3;
printf("Looks like: %.1f + %.1f = %.1f\n", a, b, a+b);
printf("The truth: %.20f + %.20f = %.20f\n", a, b, a+b);
return 0;
}
On an x86 GCC/Linux computer, I get the result:
Looks like: 8.7 + 1.3 = 10.0 The truth: 8.69999980926513671875 + 1.29999995231628417969 = 9.99999976158142089844
On a PPC GCC/OS X computer, I get the result:
Looks like: 8.7 + 1.3 = 10.0 The truth: 8.69999980926513671875 + 1.29999995231628417969 = 10.00000000000000000000
Notice how 8.7 and 1.3 are both rounded down in this particular case. If you chose numbers that get rounded up, you might see a number larger than 10 on the right hand side.
See What Every Computer Scientist Should Know About Floating-Point Arithmetic, by David Goldberg (link).
Floating point numbers are not the same as real numbers and their behavior is quite different.
Real numbers are infinite, while floating point numbers are finite and can only represent a small subset of all the possible real numbers.
Since not all real numbers can be represented as floating point, a floating point assignment or operation may give you slightly different results than the same done in the real number space.
See the wikipedia entry on floating point for an introduction. The section about floating point accuracy is particularly interesting and gives other examples similar to yours.
There's no real difference between the two. They both behave in ways that are unpredictable.
What you're doing is equivalent to flipping a coin twice and asking what you did differently to get heads one time and tails the other. It's not that you did anything different, it's that this is what happens when you flip coins.
If you ask a person to add one third and two thirds using 6 digit decimal precision and then round down to an integer, you might get 0 and you might get 1. It will depend on things like whether they represent 2/3 as "0.666666" or "0.6666667" and they're both acceptable. So both 0 and 1 are acceptable answers. If you're not prepared to accept either answer, don't ask that kind of question.