Как получить точность от десятичной дроби до n знаков в программе на C # для Pi

Что касается этого вопроса, Pi в C #

Я закодировал приведенный ниже код и дал результат с последними 6 цифрами как 0. Поэтому я хочу улучшить программу, преобразовав все в десятичные числа. Я никогда раньше не использовал десятичные дроби в C # вместо double, и мне удобно только с double в моем обычном использовании.

Так что, пожалуйста, помогите мне с десятичным преобразованием, я попытался заменить все двойное на десятичное в начале, и это не помогло :(.

 using System;

class Program
{
    static void Main()
    {
    Console.WriteLine(" Get PI from methods shown here");
    double d = PI();
    Console.WriteLine("{0:N20}",
        d);

    Console.WriteLine(" Get PI from the .NET Math class constant");
    double d2 = Math.PI;
    Console.WriteLine("{0:N20}",
        d2);
    }

    static double PI()
    {
    // Returns PI
    return 2 * F(1);
    }

    static double F(int i)
    {
    // Receives the call number
   //To avoid so error
    if (i > 60)
    {
        // Stop after 60 calls
        return i;
    }
    else
    {
        // Return the running total with the new fraction added
        return 1 + (i / (1 + (2.0 * i))) * F(i + 1);
    }
    }
}

Вывод

Получить PI из методов, показанных здесь 3.14159265358979000000 Получить PI из константы класса .NET Math 3.14159265358979000000


person Karthik Ratnam    schedule 05.05.2011    source источник
comment
Посмотрите ответ Эрика Липперта на очень похожий вопрос: stackoverflow .com / questions / 4107047 / c-high-double-precision /.   -  person Justin    schedule 05.05.2011
comment
@ Джастин, я не хочу менять алгоритм на Эрика. Меня это устраивает.   -  person Karthik Ratnam    schedule 05.05.2011


Ответы (1)


Что ж, замена double на decimal - хорошее начало, а затем все, что вам нужно сделать, это изменить константу с 2,0 на 2,0 м:

static decimal F(int i)
{
    // Receives the call number
    // To avoid so error
    if (i > 60)
    {
        // Stop after 60 calls
        return i;
    }
    else
    {
        // Return the running total with the new fraction added
        return 1 + (i / (1 + (2.0m * i))) * F(i + 1);
    }
}

Конечно, точность по-прежнему ограничена, но чуть больше double. Результат 3.14159265358979325010.

person Jon Skeet    schedule 05.05.2011
comment
Не могли бы вы объяснить алгоритм решения Джона Скита. - person user2922935; 22.02.2016
comment
@ user2922935: Это тот же алгоритм, что и в исходном коде. Все, что я сделал, - это последовательно использовал decimal. - person Jon Skeet; 22.02.2016