Доля действительного числа в python, дающего сложный ответ

Импортирование дроби из дроби позволяет получить дробное представление действительного числа, но дать ответы довольно сложно, что кажется очень простым методом бумажного пера.
Fractions(.2) giving answer 3602879701896397/18014398509481984,
что составляет 0.20000000000000001110223024625157, почти 0,2, но я хочу, чтобы оно было просто 1/5.
Я знаю, что для этого использования есть limit(), но мне просто нужен наименьший числитель и знаменатель, который дает точное действительное число bcoz. Я имею дело с большим количеством чисел в большом диапазоне, поэтому я не могу использовать один и тот же аргумент limit() для всех,

2 ответа

Ваш странный вывод является результатом проблем с плавающей точкой. В некоторых случаях вы можете преодолеть это, ограничив знаменатель с помощью Fraction.limit_denominator (). Эта процедура, конечно, также может вызвать ошибки округления, если реальное значение знаменателя больше, чем пороговое значение, которое вы используете. Значение по умолчанию для этого порога составляет 1000 000, но вы также можете использовать меньшие значения.

import fractions

print(fractions.Fraction(0.1))
>>>3602879701896397/36028797018963968

#lower the threshold to 1000
print(fractions.Fraction(0.1).limit_denominator(1000))
>>>1/10

#won't work for smaller fractions, use default of 1,000,000 instead
print(fractions.Fraction(0.00001).limit_denominator(1000))
>>>0
print(fractions.Fraction(0.00001).limit_denominator())
>>>1/100000

Конечно, как объясняется в первом предложении, существуют ограничения точности из-за способа хранения чисел с плавающей запятой. Если у вас есть числа величиной 10^9, вы не получите точное представление 10 цифр в дробной части как

a = 1234567890.0987654321
print(a)

демонстрирует. Но вы можете спросить себя, действительно ли вам нужна точность 10^-15, если ваш вклад не отражает эту точность. Если вы хотите иметь более высокую точность, вы должны использоватьdecimal модуль с самого начала с повышенным уровнем точности во всех математических операциях. Еще лучше заботиться о числителях и знаменателях как целочисленных значениях с самого начала - в Python целочисленные значения теоретически не ограничены по размеру

Вы можете использовать Fraction класс для представления 0.2и вы можете получить доступ к числителю и знаменателю следующим образом:

>>> from fractions import Fraction
>>> f = Fraction(1, 5)
>>> f.numerator
1
>>> f.denominator
5

Надеюсь, поможет.

Другие вопросы по тегам