C# — Как преобразовать/отобразить результат с плавающей запятой/экспоненциальный результат в полное/целое число

Я использую С# внутри .Net Environment. У меня есть действительно большие целочисленные значения, введенные пользователем, которые затем делятся друг на друга, и отображается результат. Теперь мы знаем, что 4/2 = 2 просто, но что, если мы разделим

.0232321312321312312312312321032132139813912839013809123801283012983901283012380129382190381209382190382190382109382109382109312/ 1200000232323213213213213878978398494849023834902348239048239048239048239048239048239048239048239048239048239048239048239048239048239048239048239048239048234902384902384902384902348239048239048234

Ответ вроде 1.93601056119411E-197

Я хочу отобразить ответ в виде полного десятичного значения/значения с плавающей запятой вместо того, чтобы полагаться на символ E.


person Muhammad Ali    schedule 13.04.2011    source источник
comment
возможный дубликат Удалить знак E из большого числа с плавающей запятой, С#?   -  person    schedule 13.04.2011
comment
деление этого как есть дает слишком большую ошибку интеграла, тогда как деление на 1,29... дает результат 0,0193601056119411. Так что я не уверен, что...   -  person iamserious    schedule 13.04.2011
comment
Я почти уверен, что у Джона Скита есть код для этого. Вот если бы он был где-то поблизости...   -  person Gabe    schedule 13.04.2011


Ответы (3)


я написал код

using System.Numerics;

BigInteger x = BigInteger.Parse("0232321312321312312312312321032132139813912839013809123801283012983901283012380129382190381209382190382190382109382109382109312");
BigInteger y = BigInteger.Parse("1200000232323213213213213878978398494849023834902348239048239048239048239048239048239048239048239048239048239048239048239048239048239048239048239048239048234902384902384902384902348239048239048234
")
BigInteger answer = BigInteger.Divide(x, y)
return answer.ToString("D")

Я думаю, это то, что вы ищете, если вам нужна дробная часть ответа, вам придется делать все это с типом Complex. Из вопроса непонятно, что вы делаете.

РЕДАКТИРОВАТЬ:

Как насчет этого

using System.Numerics;

BigInteger x = BigInteger.Parse("0232321312321312312312312321032132139813912839013809123801283012983901283012380129382190381209382190382190382109382109382109312");
BigInteger y = BigInteger.Parse("1200000232323213213213213878978398494849023834902348239048239048239048239048239048239048239048239048239048239048239048239048239048239048239048239048239048234902384902384902384902348239048239048234
")
Complex answer = Complex.Divide((Complex)x, (Complex)y)
return answer.ToString("F50") //If 50 decimal places is enough.
person Jodrell    schedule 13.04.2011
comment
Тип данных Complex внутренне использует Doubles, поэтому вы потеряете точность. - person Heinzi; 13.04.2011
comment
Хайнци, я думаю, ты прав, зависит от того, насколько точным ты должен быть. - person Jodrell; 13.04.2011

Я предполагаю, что вы не только хотите, чтобы перед вашим значением стояло "0,00...", но также хотите видеть "недостающие" цифры после 411.

Если это так, то вы не можете сделать это с типами данных с плавающей запятой, поскольку типы данных с плавающей запятой в .NET просто не имеют требуемой точности. Вам нужно будет прибегнуть к внешним библиотекам, таким как, например, W3b.Sine (не проверено, только что нашел с помощью быстрого поиска в Google), которые позволяют использовать десятичные дроби произвольной точности.

person Heinzi    schedule 13.04.2011
comment
Из вопроса не понятно? Я предположил, что он хотел 0.000000...0000193601056119411. - person JustABitOfCode; 13.04.2011

Я использую .ToString("N0"), который, похоже, справляется со своей задачей, когда у меня возникает та же проблема.

person JustABitOfCode    schedule 13.04.2011
comment
Извините, я неправильно прочитал вопрос. .ToString(N0) отформатирует число с 0 десятичными знаками. Проблема, с которой я столкнулся, заключалась в форматировании числа с силой +ve, а не с -ve. - person JustABitOfCode; 13.04.2011
comment
Да, это будет. Поскольку ваш результат имеет степень -ve, все интересные цифры находятся за десятичной точкой, поэтому форматирование числа с 0 десятичными знаками вернет 0. Попробуйте .ToString(N50). Я думаю, что это должно вернуть число с первыми 50 знаками после запятой, хотя я этого не проверял. - person JustABitOfCode; 13.04.2011