3

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

(pow(10, i) - 1)/23 % 1

在 Python 3 中,但我得到0.0所有i大于 17 的值。

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

4

3 回答 3

8

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

>>> 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

尽管使用十进制模块将是另一种选择。

更新:等等,再想一想,这里的答案总是会是((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
于 2012-05-22T19:38:09.353 回答
1

不使用其他模块的一种选择是

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

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

使用执行模幂运算的 pow 的三个参数形式,您可以完全避免大量数字,从而提高性能。

((pow(10, i, 23) + 22) % 23) / 23.0
于 2012-05-22T19:55:22.007 回答
0

您的意思是:“如何在 Python 中提取大浮点数的小数部分?不再有“小数”部分,因为逗号是浮动的...... :-)

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

您必须应用一个为大型i.

于 2012-05-22T19:38:28.170 回答