C# десятичное к дробному

Удвоение до дроби

Иногда полезно представлять десятичные числа в виде дробей в C#. Используя простой алгоритм, мы можем аппроксимировать десятичные значения к дробному представлению.

Прямой алгоритм

Прямой способ превратить десятичное число в дробь — записать число как дробь 10. Что это значит? Возьмем, к примеру, 0,4. Это то же самое, что сказать 4/10, и, уменьшая, мы получаем дробь 2/5. Имеете около 0.125? То есть 125/1000, что уменьшается до 1/8.

А как насчет 0,753543? Технически это то же самое, что и 753543/1000000, который мы также можем уменьшить. Как насчет 0,7535234236233? Начинать с прямой дроби становится немного смешно на этом этапе.

Но возьмем, к примеру, 0,7535234236233. мы можем округлить число до 0,75, что равно 3/4. Таким образом, 3/4 не является точной дробью, но это близкое приближение.

Таким образом, наш алгоритм может быть более эффективным, просто сосредоточившись на получении дроби, которая находится в определенном диапазоне от фактического значения. Приближение.

Алгоритм аппроксимации

Один алгоритм, который мне очень понравился.

Этот алгоритм довольно прост в выполнении. Ниже я попытаюсь объяснить это:

Для заданного десятичного числа 3,43 отделите целое число (3) от десятичной части (0,43). Используя десятичную дробь, вычисляем новое значение. Назовем его значением «x». Полученная фракция составит 1/(3+х). Что такое x? «x» — это тот же алгоритм, применяемый к результату 1/0.43, который в данном случае равен 2.325…etc.

Как вы можете сказать, это идеальное место для реализации рекурсивного алгоритма, поскольку значение «x» является результатом той же функции. Но есть две важные вещи, которые мы должны решить, прежде чем осуществлять его.

Во-первых, это важнейшее правило рекурсивной функции: когда мы останавливаемся? Как описано на математической странице, хорошее место для остановки — это когда значение (1 / десятичная часть) действительно мало. Настолько маленький, что его можно считать равным 0. Затем остальная часть вызова может закончить сложение накопленных значений до тех пор, пока мы не получим окончательное (1 / целое число + x) значение.

Однако вот у нас есть еще одна проблема. «x» — дробь (так как результатом нашей функции является превращение десятичной дроби в дробь). Как мы можем добавить x к этому значению, не получив снова десятичную дробь? Что еще более важно, как только мы добавим его, мы получим что-то вроде 1 / (8 / 3). Используя простую дробную математику, мы знаем, что ответ равен 3 / 8, но как мы можем это реализовать?

Именно здесь появляется объектно-ориентированный стиль C#. 

Реализация

Есть еще несколько вещей, которые следует учитывать перед реализацией кода C#. Мы договорились, что рекурсия прекратится, когда (1 / десятичное значение) станет слишком маленьким. Но что слишком мало? В этом случае мы будем использовать Double.Epsilon по умолчанию и предоставить перегрузку для пользователя, чтобы указать свои собственные границы.

Проблема сейчас в том, что значения никогда не будут меньше Эпсилона, если они на самом деле не равны нулю (или, по крайней мере, не вычисляются как ноль). Мы можем решить эту проблему, предоставив максимальное количество рекурсивных вызовов. При каждом вызове значение уменьшается, как только оно достигает 0, рекурсивный вызов будет возвращать 0, несмотря ни на что. С помощью этих двух вещей мы теперь можем реализовать алгоритм. Помните, что нам нужна структура для представления дробей.

Фактический код для преобразования десятичного числа в дробь прост, но немного длинный.

 

Обновлено: 08.01.2022 — 16:50

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.