【问题标题】:PI nth digit after decimalPI 小数点后第 n 位
【发布时间】:2020-02-20 15:05:37
【问题描述】:

我想制作一个程序,它会返回 PI 编号的小数点后第 n 个数字。 只要我不将 n 设置为高于 50,它就可以很好地工作。我可以修复它还是 Python 不允许这样做?

这是我的代码:

pi = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270938521105559644622948954930381964428


def nth_pi_digit(n=input("How many digits after decimal you would like to see?(PI number):  ")):
    try:
        n = int(n)
        if n <= 204:
            return print(format(pi, f".{n}f"))
        else:
            print("Sorry, we have pi with 204 digits after decimal, so we'll print that")
            return print(format(pi, ".204f"))
    except:
        print("You need to put a integer digit")


nth_pi_digit()

【问题讨论】:

  • 在默认参数中使用副作用是可怕的伎俩。而且它只适用于函数定义时间,所以这是你代码中的一个错误
  • 另外,return print(...) 返回None。这是print(...); return的一个非常奇怪的简写形式
  • 这能回答你的问题吗? 1000 digits of pi in Python

标签: python digits pi


【解决方案1】:

float 数据类型对您可以获得的精确度有限制。大约 50 位数。

我建议使用Decimal 来表示如此高精度的数字:

>>> from decimal import Decimal
>>> d = Decimal('3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270938521105559644622948954930381964428')
>>> format(d, ".50f")
'3.14159265358979323846264338327950288419716939937511'
>>> format(d, ".204f")
'3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102709385211055596446229489549303819644280'

通过这种方式,您可以在不损失精度的情况下对其进行数学运算,而“将其视为字符串”是无法做到的。

【讨论】:

    【解决方案2】:

    你可以简单地使用文本:

    pi = '3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270938521105559644622948954930381964428'
    

    虽然使用十进制更好。

    【讨论】:

      【解决方案3】:

      将 PI 实例化为字符串对象:

      pi = '3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270938521105559644622948954930381964428'
      

      然后您可以执行切片以显示所需数量的小数:

      n = 10    # 10 decimals
      print(pi[:2+n])
      

      【讨论】:

      • pi 在转换为字符串之前会被截断到小数点后 50 位
      • @tomgalpin 没错,因为它是以浮点数开始的,所以它会失去精度
      • 你是对的,它不是一个转换,它应该从一开始就被实例化为一个字符串
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多