Как проверить, приведет ли деление с помощью bcdiv () к конечному результату? - PullRequest
0 голосов
/ 22 марта 2012

Я создаю класс для работы с десятичными числами произвольной точности в PHP, используя внутреннюю библиотеку BCMath .

Когда сложение , вычитание или умножение двух чисел, можно прогнозировать необходимую точность, чтобы быть уверенным, что не потеряет ни одной цифры.

Однако, когда дело доходит до деление , количество цифр может быть бесконечным, и я бы хотел, чтобы моя библиотека вызвала исключение, если результат деления не может быть представлен в виде конечного числа цифр .

Как узнать, прежде чем делить, будет ли результат конечным, и в этом случае вычислить масштаб результата?

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Вам нужно выполнить % (модуль) операцию ... подождите.О, SH ...

На самом деле это невозможно без выполнения деления (или аналогичных шагов).

Я могу посоветовать вам создать divmod функция, которая будет возвращать результат целочисленного деления (т.е. округления в меньшую сторону) и остатка.И проверьте, что остаток равен нулю.

Также любое рациональное число может быть представлено как с повторяющимся десятичным числом , например 1/3 = 0.(3) и 1/7 = 0.(142857).Плохо то, что длина периода может достигать значения этого числа, поэтому лучше представлять число как n/m внутри, если кто-то хочет выполнить точные вычисления с рациональными числами.

0 голосов
/ 22 марта 2012

Сокращенная дробь имеет конечное десятичное представление, если единственными простыми множителями знаменателя являются 2 и 5.

Используя BCMath, я полагаю, вам придется реализовать евклидов алгоритм для уменьшения дроби до наименьшегоусловия, а затем проверить знаменатель.Кажется, это не стоит хлопот.

...