Reputation: 14917
Im currently reading Code Complete by Steve McConnell, specifically page 295 on floating-point numbers.
When i ran the following code:
double nominal = 1.0;
double sum = 0.0;
for (int i = 0; i < 10; i++)
{
sum += 0.1;
Console.WriteLine("sum: " + sum.ToString());
}
if (equals(nominal,sum))
{
Console.WriteLine("Numbers are the same");
}
else
{
Console.WriteLine("Numbers are different");
}
I got a print out of 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 Numbers are different
How come I didn't get the output that is suppose to happen? ie: 0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.79999999999999999 0.89999999999999999 0.99999999999999999 Numbers are different
Is C# rounding numbers when I do an implicit conversion from double to string? I think so because when i debug the application and step through the for loop, i can see the non-terminating repeating decimal numbers. What do you think? Am i right or wrong?
Upvotes: 8
Views: 5099
Reputation: 78683
The short answer is: It's floating point, so don't count on anything but it being right (for suitable values of "right")! The long answerer is to understand how floating point works and how people work with floating point. IIRC GNU printf (and others I would assume) special case "really really close to a nice base 10 number".
Upvotes: 2
Reputation: 26436
double.ToString() uses the general format which defaults to 15 decimal places if the precision is not specified. So it does do a little rounding which is why you're seeing what you're seeing. For example 0.89999999999999999 which you specified in your question is 17 decimal places. You could actually see the entire number by doing sum.ToString("g17")
.
You can find .net's Standard Numeric Format Strings and their default precision here: http://msdn.microsoft.com/en-us/library/dwhawy9k(VS.80).aspx
Upvotes: 14
Reputation: 537
It is is in the ToString default behaviour. If you look at sum in the debugger you get this, which shows you the value without routing through ToString:
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.79999999999999993
0.89999999999999991
Indicating that the underlying behaviour is as you would expect.
hth
Upvotes: 2