Потеря точности в Double.ToString() - C#

Узнай цену своей работы

Формулировка задачи:

Столкнулся с проблемой перевода 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;
        }
Или для таких вариантов нужен свой double? Заранее спасибо
//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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5