Python中的小数精度

时间:2018-10-26 05:38:52

标签: python

运行代码

b = 7**7

我得到b为823543

但是当我跑步

b= 823543.0**(1.0/7.0)

它给我b表示6.999999999999999

如果它像4 **​​(1/2)一样简单,则返回2。

我的问题是为什么python不仅仅返回完美的7?

我也这样做是为了检查数字是否可以写n可以以p ^ q的形式写,其中p> 0和q> 1是这样做的:

 def isPower(self, A):
    possible = 0 # Integer value to check  if it is possible , 0 assuming it is false initally
    if(A==1):
        return 1
    for i in xrange(2,A-1):
        res = float(A)**(1.0/float(i)) #Check if it has sqaure root or cube root up untill A-1
        if(res.is_integer()): #If taking the power gives me whole number then saying it is possible
            possible = 1
            break
    return possible

此逻辑以更高的数字失败,例如823543,因为幂返回一个不精确的值,我该如何解决呢?

3 个答案:

答案 0 :(得分:1)

您未使用小数-您正在使用浮点数。他们权衡准确性与速度。

尝试一下;

from decimal import Decimal
b = 7 ** 7  # 823543
a = Decimal(1) / Decimal(7)
b ** a  # returns (for me) Decimal('7.000000000000000000000000004')

答案 1 :(得分:0)

为什么不round注册

>>> b= 823543**(1/7)
>>> round(b)
7
>>> 

现在您有7(七)

答案 2 :(得分:0)

您应该阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

简而言之:浮点数表示为尾数和指数。像

0.1234 * 10^1

尾数是1234(如果我没记错的话,指数用2补码表示)

这意味着某些整数不能准确地表示为浮点数。

您可以将7和823543完全表示为浮点数,但我认为这不适用于1/7(手头没有纸):https://www.h-schmidt.net/FloatConverter/IEEE754.html

还要考虑如何计算n根。