Python:大型浮点数的小数部分

时间:2012-05-22 19:32:23

标签: python

我正在尝试为(pow(10, i) - 1)/23获取0 < i < 50的小数部分。我试过了

(pow(10, i) - 1)/23 % 1
在Python 3中

,但0.0的所有值都大于17,我得到i

如何在Python中提取大整数的小数部分?

3 个答案:

答案 0 :(得分:8)

为了保持精确度,我可能会使用fractions模块:

>>> from fractions import Fraction
>>> Fraction(10)
Fraction(10, 1)
>>> Fraction(10)**50
Fraction(100000000000000000000000000000000000000000000000000, 1)
>>> Fraction(10)**50-1
Fraction(99999999999999999999999999999999999999999999999999, 1)
>>> (Fraction(10)**50-1)/23
Fraction(99999999999999999999999999999999999999999999999999, 23)
>>> ((Fraction(10)**50-1)/23) % 1
Fraction(5, 23)
>>> float(((Fraction(10)**50-1)/23) % 1)
0.21739130434782608

虽然使用decimal模块是另一种选择。

更新:等等,第二个想法,这里的答案总是((10^n-1) % 23)/23,所以上面的内容是显着的过度杀伤(尽管它可以更好地扩展到更复杂的问题)。我们甚至可以利用三参数pow函数:

>>> pow(10, 50, 23)
6
>>> pow(10, 50, 23) - 1
5
>>> (pow(10, 50, 23) - 1) % 23 # handle possible wraparound
5
>>> ((pow(10, 50, 23) - 1) % 23) / 23.0
0.21739130434782608

答案 1 :(得分:1)

一个不使用其他模块的选项是

N = 10**i - 1
remainder = N % 23
print remainder / 23.0

当然也很容易写在一行上。

使用执行three argument form of powmodular exponentation,您可以完全避免大量数据,以提高性能。

((pow(10, i, 23) + 22) % 23) / 23.0

答案 2 :(得分:0)

你的意思是:“如何在Python中提取大型 float 的小数部分?不再有”十进制“部分,因为逗号是浮动。 ..: - )

在Python 2.7上,对于i=20(我除以23.0以获得浮点结果),结果为4.347826086956522e+18。数字10 ^ 18有16位数字。因此,“逗号之后”没有数字(这可能仍然不正确i=20,因为可能并非所有数字都已被打印,但至少你得到了我的意思的概念。

您必须应用一个为大i实现任意精度算术的库。