TypeError: both arguments should be Rational instances when trying to use fractions

TypeError: both arguments should be Rational instances when trying to use fractions

所以我正在尝试编写一个代码来解决微积分中的一般解决方案,我的一个值是 f1 = fractions.Fraction(2.0, period) 的分数,但是如果我使用 12.5 作为期间它返回错误。 代码:

from cmath import sin
import math
import re
import operator
import fractions
from decimal import Decimal

amplitude = input("What is the A value?: ")
period = input("What is the P value?: ")
ogperiod = float(period)
period = float(period)


f1 = fractions.Fraction(2.0, period)
print(f1)

但我得到的只是类型错误:两个参数都应该是 Rational 实例 完整错误代码:

TypeError                                 Traceback (most recent call last)
Input In [84], in <cell line: 27>()
     23 ogperiod = float(period)
     24 period = float(period)
---> 27 f1 = fractions.Fraction(2.0, period)
     28 print(f1)
     31 bpi = 2 * math.pi

File /opt/homebrew/Cellar/python@3.9/3.9.8/Frameworks/Python.framework/Versions/3.9/lib/python3.9/fractions.py:152, in Fraction.__new__(cls, numerator, denominator, _normalize)
    147     numerator, denominator = (
    148         numerator.numerator * denominator.denominator,
    149         denominator.numerator * numerator.denominator
    150         )
    151 else:
--> 152     raise TypeError("both arguments should be "
    153                     "Rational instances")
    155 if denominator == 0:
    156     raise ZeroDivisionError('Fraction(%s, 0)' % numerator)

TypeError: both arguments should be Rational instances

回溯告诉你问题到底是什么:Fraction 实例的分子和分母都需要是有理数——即表示为两个整数之比的数。由于在硬件中实现的方式,浮点数本身并不合理。有关详细信息,请参阅 Is floating point math broken?

基本上,fractions.Fraction 实例的分子和分母本身需要是 intFraction

我发现一个问题是将float分配给periodFraction class 有一个构造函数,它接受 Rational class 的两个值(分子和分母)(参见 documentation)。自 Python 版本 3.2 以来,可以从 float 初始化 Fraction 但仅使用一个参数。

因此,如果您想保留 2 个值(2.0 和 period),则必须将 2.0 更改为 2 并将 period 用作 int(失去精度)。因此,您的代码将是:

f1 = fractions.Fraction(2, int(period))

编辑:

如果想保持period的精度,最好将其转化为分数,然后做小数除法初始化f1。即:

period = fractions.Fraction(period)
f1 = fractions.Fraction(2 * period.denominator, period.nominator)