Math-Pow неверные результаты - PullRequest
0 голосов
/ 09 марта 2011
            double a1;
        a1 = Math.Pow(somehighnumber, 40);
        something.Text = Convert.ToString(xyz);

результат, который я получаю - E + 41 и т. Д. это как 1,125123E + 41 и т. д. Я не понимаю, почему.

Ответы [ 3 ]

11 голосов
/ 09 марта 2011

Ваш вопрос очень неясен;в будущем вы, вероятно, получите лучшие результаты, если опубликуете четкий вопрос с примером кода, который фактически компилируется и демонстрирует проблему, с которой вы на самом деле сталкиваетесь. Не заставляйте людей догадываться, в чем проблема.

Если вы хотите отобразить число с плавающей запятой двойной точности без научной записи, тогда используйте стандартный спецификатор форматирования чисел :

Console.WriteLine(string.Format("{0:N}", Math.Pow(10, 100)));

Результат:

10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.00

Если у вас возникла проблема с округлением результата, тогдане использовать поплавки двойной точности;они с точностью до 15 знаков после запятой.Попробуйте выполнить свою арифметику в BigIntegers, которые имеют произвольную целочисленную точность.

7 голосов
/ 09 марта 2011

Это научная запись .Это означает 1.125123 * 10 41 .Научная запись полезна, если ваш номер становится настолько большим, что для его полного отображения потребуется много места на экране.Кроме того, арифметика с плавающей точкой не является точной, поэтому, даже если вы отобразите число полностью, большинство цифр все равно будут неправильными.

Если вы хотите точных вычислений, вы должны использовать BigIntegerвместо double (этот тип присутствует в .NET 4.0 или новее).

0 голосов
/ 09 марта 2011
double bigNum = Math.Pow(100, 100);
string bigString = string.Format("{0:F}", bigNum);

http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#FFormatString

Или вы можете использовать предоставленный 4.0 BigInteger (добавить ссылку на System.Numerics к проекту):

Numerics.BigInteger bigInt = Numerics.BigInteger.Pow(1000, 1000);
string veryBigString =  bigInt.ToString("F");

Как видите, он также работает с ToString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...