Потеря точности в 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д