7

我想获得1/7更高的精度,但它被截断了。转换有理数时如何获得更好的精度?

>>> str(1.0/7)[:50]
'0.142857142857'
4

4 回答 4

9

Python 有一个用于任意精度计算的内置库:Decimal。例如:

>>>from decimal import Decimal, getcontext
>>>getcontext().prec = 50
>>>x = Decimal(1)/Decimal(7)
>>>x
Decimal('0.14285714285714285714285714285714285714285714285714')
>>>str(x)
'0.14285714285714285714285714285714285714285714285714'

查看Python Decimal 文档以获取更多详细信息。您可以根据需要将精度更改为尽可能高。

于 2009-11-12T04:34:44.407 回答
6

您可以将分子乘以一个大的 10^N 并坚持使用任意精度的整数。

编辑

我的意思是:

> def digits(a,b,n=50): return a*10**n/b
.
> digits(1,7)
14285714285714285714285714285714285714285714285714L

Python 的整数是任意精度的。Python 的浮点数从来都不是任意精度的。(正如另一个答案指出的那样,您必须使用十进制)

于 2009-11-12T04:04:13.067 回答
3

使用 Perl(因为我不会写 Python ;-):

use strict; use warnings;

use integer;

my $x = 1;
my $y = 7;

for (1 .. 50) {
    $x *= 10 if $x < $y;
    my $q = $x / $y;
    $x -= $q * $y;
    print $q;
}

print "\n";
14285714285714285714285714285714285714285714285714

正如您可以手动验证的那样,数字重复。使用打印"%.50f"会给你更精确的错觉

于 2009-11-12T04:08:13.900 回答
2

使用gmpy

>>> import gmpy
>>> thefraction = gmpy.mpq(1, 7)
>>> hiprecfloat = gmpy.mpf(thefraction, 256)
>>> hiprecfloat.digits(10, 50, -10, 10)
'0.14285714285714285714285714285714285714285714285714'
>>> 

你不能用普通的浮点数来做——它们只是没有足够的精度来处理 50 位数字!我想有一种方法可以做到这一点(在 2.6 或更好的版本中)fractions.Fraction,但我不熟悉除 as 之外的任何格式化方式'1/7'(在你的情况下不是很有用!-)。

于 2009-11-12T04:10:08.110 回答