如何获得正确的十进制结果



我正在尝试编写一个程序来搜索小数基数中整数的重复表示。因此,我必须做这样的事情:

1.1**7

等于 1.9487171。但是,python 会自动将该结果表示为浮点数,而给定的值是精确的。这就是我需要的,这与四舍五入浮点数不同。我还必须允许程序指定有多少位小数。我尝试使用十进制模块,但无法完全使其工作。最好的方法是什么?

decimal.Decimal参数应该是字符串。如果你使用float,它会带来它的不精确性:

>>> decimal.Decimal('1.1')**7
Decimal('1.9487171')
>>>

>>> decimal.Decimal(1.1)**7
Decimal('1.948717100000001101423574568')
>>>

十进制模块将为您提供确切的结果:

>>> Decimal('1.1') ** 7
Decimal('1.9487171')

对于非十进制基数,分数模块将执行精确的算术运算。 唯一的问题是输出是分数形式,而不是指示您似乎正在寻找的十进制表示法(可能带有重复的非终止序列(:

>>> Fraction(3, 7) ** 5
Fraction(243, 16807)
>>> Context(prec=200).divide(243, 16807)
Decimal('0.014458261438686261676682334741476765633367049443684179211043017790206461593383709168798714821205450110073183792467424287499256262271672517403462842863092758969477003629440114238115071101326828107336229')

小数基数

听起来像fractions,不是吗?

>>> import fractions
>>> fractions.Fraction(11, 10) ** 7
Fraction(19487171, 10000000)
>>> fractions.Fraction(13, 11) ** 7
Fraction(62748517, 19487171)

您是否尝试过检查容差范围内的相等性? 例如

def approx(left, right, tolerance=1**10-6):
    if left - right < tolerance:
        return True
    else:
        return False

最新更新