Потеря точности в Double.ToString() - C#
Формулировка задачи:
Столкнулся с проблемой перевода double в строку,
Или для таких вариантов нужен свой double?
Заранее спасибо
string sb = b.ToString();
. Начиная с определенного числа после запятой, число в строке отличается от числа в double, а точнее -- происходит округление. Как решить эту проблему? Ну и, может кто увидит возможную ошибку?
Листинг программы
- public static BigIntTest operator *(BigIntTest a, double b)
- {
- string sb = b.ToString();
- int c = (!sb.Contains("E-")) ? sb.Length - sb.IndexOf(",") - 1
- : Convert.ToInt32(sb.Split('-')[1]);
- int d = (!sb.Contains("E-")) ? 0
- : sb.Remove(sb.IndexOf("E")).Length - sb.IndexOf(",") - 1;
- string[] sbArray = (!sb.Contains("E-")) ? sb.Split(',')
- : sb.Remove(sb.IndexOf("E")).Split(' ');
- sb = (sbArray.Count() > 1) ? string.Format("{0}{1}", sbArray[0], sbArray[1])
- : sbArray[0].ToString().Replace(",", "");
- a = a * sb;
- a = (!b.ToString().Contains("E-")) ? a.ToString().Remove(a.valueInt.Count - c)
- : ((c + d) < a.valueInt.Count) ? a.ToString().Remove(a.valueInt.Count - d - c)
- : "0" ;
- while (a.valueInt[a.valueInt.Count - 1] == 0 && a.valueInt.Count > 1)
- a.valueInt.RemoveAt(a.valueInt.Count - 1);
- return a;
- }
//PS BigInt может принимать стринг / list<byte>
//PPS BigInt целые числа
Решение задачи: «Потеря точности в Double.ToString()»
textual
Листинг программы
- var d = double.Parse("0.9999888e-131");
- //степень числа
- var power = Math.Log10(d);//power = -131
- //получаем обыкновенную дробь:
- var denominatorPower = (int)(15 - power);//увеличиваем степень на 15, поскольку double имеет 15 значащих знаков
- var numerator = (decimal)(d / Math.Pow(10, denominatorPower));
- //выводим
- Console.WriteLine("Числитель: {0}", numerator);//Числитель: 999988800000000
- Console.WriteLine("Знаменатель: 10^{0}", denominatorPower);//Знаменатель: 10^146
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д