Python 关于py3中的分数类
在分数表示法中,是否有办法找到小数点后第k个位置的数字<代码>k最多为Python 关于py3中的分数类,python,python-3.x,math,floating-point,fractions,Python,Python 3.x,Math,Floating Point,Fractions,在分数表示法中,是否有办法找到小数点后第k个位置的数字k最多为10^6。 我尝试将float(Fraction)转换为str,但没有给我所需的精度。您正在寻找Python中的模块(Python自带) 从十进制导入* 除法=5/3 印刷品(分部)#1.6667 getcontext().prec=6 除法=十进制(5)/十进制(3) 印刷品(分部)#1.66667 您正在寻找Python中的模块(Python自带) 从十进制导入* 除法=5/3 印刷品(分部)#1.6667 getcontext(
10^6
。
我尝试将float(Fraction)
转换为str
,但没有给我所需的精度。您正在寻找Python中的模块(Python自带)
从十进制导入*
除法=5/3
印刷品(分部)#1.6667
getcontext().prec=6
除法=十进制(5)/十进制(3)
印刷品(分部)#1.66667
您正在寻找Python中的模块(Python自带)
从十进制导入*
除法=5/3
印刷品(分部)#1.6667
getcontext().prec=6
除法=十进制(5)/十进制(3)
印刷品(分部)#1.66667
您可以使用高精度浮点包(如十进制
)来计算此值,但如果您只需要一个位数,则有更有效的方法:我们可以计算34/23
的万亿位数(例如)在几分之一秒内,使用不大于1000的整数进行整个计算
下面是一个简单的函数,它给出分数点p/q
后的k
th位:
def digit(p, q, k):
"""
Return the kth digit after the point (k >= 1)
of the fraction p / q. p, q and k should be integers.
"""
return pow(10, k-1, q) * p % q * 10 // q
还有一个例子:34/23具有十进制扩展1.4782608695251739130434782608695215217…
,因此让我们使用上述函数从该扩展中获取一些数字
>>> digit(34, 23, 1)
4
>>> digit(34, 23, 3)
8
>>> digit(34, 23, 20)
0
>>> digit(34, 23, 30)
6
>>> digit(34, 23, 1_000_000_000) # billionth digit after the point
5
下面以34/23
为例解释一下为什么这样做:假设我们要计算小数点后的第5位。以下是手动操作的方法:我们首先乘以10**4
,将所需数字之前的位置移动到点的左侧:
10**4*34/23=14782.608695252173913043478260869525217
现在我们扔掉整数部分,只保留小数部分:
分数部分=0.6086952521739130434782608695217
然后我们乘以10,得到小数点左侧的所需数字:
10*分数部分=6.086956521739130434782608695217
最后我们扔掉结果的小数部分,只保留6
,这是我们想要的数字
所有这些操作都很容易在计算上高效完成:10**(k-1)*p/q
的分数部分是(10**(k-1)*p%q)/q
,我们可以在Python中使用pow
的三参数形式作为pow(10,k-1,q)*p%q
高效地计算10**(k-1)*p%q
。现在为分子编写r
,我们要计算r*10/q
的整数部分。但这只是r*10//q
,使用Python的整数除法运算符
所以整个事情就变成了:
pow(10, k-1, q) * p % q * 10 // q
您可以使用高精度浮点包(如decimal
)来计算此值,但如果您只需要一个位数,则有更有效的方法:我们可以计算34/23
(例如)的万亿位数在几分之一秒内,使用不大于1000的整数进行整个计算
下面是一个简单的函数,它给出分数点p/q
后的k
th位:
def digit(p, q, k):
"""
Return the kth digit after the point (k >= 1)
of the fraction p / q. p, q and k should be integers.
"""
return pow(10, k-1, q) * p % q * 10 // q
还有一个例子:34/23具有十进制扩展1.4782608695251739130434782608695215217…
,因此让我们使用上述函数从该扩展中获取一些数字
>>> digit(34, 23, 1)
4
>>> digit(34, 23, 3)
8
>>> digit(34, 23, 20)
0
>>> digit(34, 23, 30)
6
>>> digit(34, 23, 1_000_000_000) # billionth digit after the point
5
下面以34/23
为例解释一下为什么这样做:假设我们要计算小数点后的第5位。以下是手动操作的方法:我们首先乘以10**4
,将所需数字之前的位置移动到点的左侧:
10**4*34/23=14782.608695252173913043478260869525217
现在我们扔掉整数部分,只保留小数部分:
分数部分=0.6086952521739130434782608695217
然后我们乘以10,得到小数点左侧的所需数字:
10*分数部分=6.086956521739130434782608695217
最后我们扔掉结果的小数部分,只保留6
,这是我们想要的数字
所有这些操作都很容易在计算上高效完成:10**(k-1)*p/q
的分数部分是(10**(k-1)*p%q)/q
,我们可以在Python中使用pow
的三参数形式作为pow(10,k-1,q)*p%q
高效地计算10**(k-1)*p%q
。现在为分子编写r
,我们要计算r*10/q
的整数部分。但这只是r*10//q
,使用Python的整数除法运算符
所以整个事情就变成了:
pow(10, k-1, q) * p % q * 10 // q
有关类似问题,请参阅。有关类似问题,请参阅。