Andriy Volkov
Andriy Volkov

Reputation: 18923

How *exactly* does C# convert double to decimal?

The following C# code prints 0.1 - why?

var s = "0.1";
var dbl = Double.Parse(s);
var dcml = Convert.ToDecimal(dbl);
Console.WriteLine(dcml.ToString());

Isn't 0.01 not representable in binary, therefore it should print 0.100000001490116 ?

Upvotes: 1

Views: 2182

Answers (1)

Jon Skeet
Jon Skeet

Reputation: 1502066

The value of dbl is precisely 0.1000000000000000055511151231257827021181583404541015625.

That's 0.1 to 17 significant digits.

The documentation for Convert.ToDecimal(Double) states:

The Decimal value returned by this method contains a maximum of 15 significant digits. If the value parameter contains more than 15 significant digits, it is rounded using rounding to nearest.

The conversion from Single (aka float) is documented to truncate earlier:

The Decimal value returned by this method contains a maximum of seven significant digits. If the value parameter contains more than seven significant digits, it is rounded using rounding to nearest.

If you call Convert.ToDecimal(Double) with a value initially converted from 0.1f, it will display 0.100000001490116:

double dbl = 0.1f;        
decimal dcml = (decimal) dbl;
Console.WriteLine(dcml);

Upvotes: 5

Related Questions