Как * точно * C # конвертирует двойные в десятичные? - PullRequest
1 голос
/ 17 мая 2019

Следующий код C # печатает 0,1 - почему?

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

Разве 0,01 не представляется в двоичном виде, поэтому должно быть напечатано 0,100000001490116?

1 Ответ

5 голосов
/ 17 мая 2019

Значение dbl точно равно 0,1000000000000000055511151231257827021181583404541015625.

Это от 0,1 до 17 значащих цифр.

Документация для Convert.ToDecimal(Double) гласит:

Десятичное значение, возвращаемое этим методом, содержит максимум 15 значащих цифр. Если параметр значения содержит более 15 значащих цифр, он округляется с использованием округления до ближайшего.

Преобразование из Single (он же float) задокументировано для усечения ранее:

Десятичное значение, возвращаемое этим методом, содержит максимум семь значащих цифр. Если параметр значения содержит более семи значащих цифр, он округляется с использованием округления до ближайшего.

Если вы позвоните Convert.ToDecimal(Double) со значением, первоначально преобразованным из 0,1f, будет отображаться 0,100000001490116:

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