Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# double to decimal precision loss

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:

enter image description here

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?

like image 977
GreyCloud Avatar asked Sep 17 '11 09:09

GreyCloud


1 Answers

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.

like image 86
David Heffernan Avatar answered Sep 26 '22 20:09

David Heffernan