I have a double "138630.78380386264"
and I want to convert it to a decimal, however when I do so I do it either by casting or by using Convert.ToDecimal()
and I lose precision.
What's going on? Both decimal and double can hold this number:
double doub = double.Parse("138630.78380386264");
decimal dec = decimal.Parse("138630.78380386264");
string decs = dec.ToString("F17");
string doubse =DoubleConverter.ToExactString(doub);
string doubs = doub.ToString("F17");
decimal decC = (decimal) doub;
string doudeccs = decC.ToString("F17");
decimal decConv = Convert.ToDecimal(doub);
string doudecs = decConv.ToString("F17");
Also: how can I get the ToString()
on double to print out the same result as the debugger shows? e.g. 138630.78380386264
?
138630.78380386264
is not exactly representable to double precision. The closest double precision number (as found here) is 138630.783803862635977566242218017578125
, which agrees with your findings.
You ask why the conversion to decimal does not contain more precision. The documentation for Convert.ToDecimal()
has the answer:
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 following example illustrates how the Convert.ToDecimal(Double) method uses rounding to nearest to return a Decimal value with 15 significant digits.
The double value, rounded to nearest at 15 significant figures is 138630.783803863
, exactly as you show above.