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

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

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

Столкнулся с проблемой перевода double в строку,

string sb = b.ToString();

. Начиная с определенного числа после запятой, число в строке отличается от числа в double, а точнее -- происходит округление. Как решить эту проблему? Ну и, может кто увидит возможную ошибку?
Листинг программы
  1. public static BigIntTest operator *(BigIntTest a, double b)
  2. {
  3. string sb = b.ToString();
  4. int c = (!sb.Contains("E-")) ? sb.Length - sb.IndexOf(",") - 1
  5. : Convert.ToInt32(sb.Split('-')[1]);
  6. int d = (!sb.Contains("E-")) ? 0
  7. : sb.Remove(sb.IndexOf("E")).Length - sb.IndexOf(",") - 1;
  8. string[] sbArray = (!sb.Contains("E-")) ? sb.Split(',')
  9. : sb.Remove(sb.IndexOf("E")).Split(' ');
  10. sb = (sbArray.Count() > 1) ? string.Format("{0}{1}", sbArray[0], sbArray[1])
  11. : sbArray[0].ToString().Replace(",", "");
  12. a = a * sb;
  13. a = (!b.ToString().Contains("E-")) ? a.ToString().Remove(a.valueInt.Count - c)
  14. : ((c + d) < a.valueInt.Count) ? a.ToString().Remove(a.valueInt.Count - d - c)
  15. : "0" ;
  16. while (a.valueInt[a.valueInt.Count - 1] == 0 && a.valueInt.Count > 1)
  17. a.valueInt.RemoveAt(a.valueInt.Count - 1);
  18. return a;
  19. }
Или для таких вариантов нужен свой double? Заранее спасибо
//PS BigInt может принимать стринг / list<byte> //PPS BigInt целые числа

Решение задачи: «Потеря точности в Double.ToString()»

textual
Листинг программы
  1.             var d = double.Parse("0.9999888e-131");
  2.  
  3.             //степень числа
  4.             var power = Math.Log10(d);//power = -131
  5.  
  6.             //получаем обыкновенную дробь:
  7.             var denominatorPower = (int)(15 - power);//увеличиваем степень на 15, поскольку double имеет 15 значащих знаков
  8.             var numerator = (decimal)(d / Math.Pow(10, denominatorPower));
  9.  
  10.             //выводим
  11.             Console.WriteLine("Числитель: {0}", numerator);//Числитель: 999988800000000
  12.             Console.WriteLine("Знаменатель: 10^{0}", denominatorPower);//Знаменатель: 10^146

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут