我希望1/7
具有更好的精度,但它被截断了。当我转换有理数时,如何才能获得更好的精度?
>>> str(1.0/7)[:50]
'0.142857142857'
答案 0 :(得分:9)
Python有一个用于任意精度计算的内置库:十进制。例如:
>>>from decimal import Decimal, getcontext
>>>getcontext().prec = 50
>>>x = Decimal(1)/Decimal(7)
>>>x
Decimal('0.14285714285714285714285714285714285714285714285714')
>>>str(x)
'0.14285714285714285714285714285714285714285714285714'
查看Python Decimal documentation了解更多详情。您可以根据需要更改精度。
答案 1 :(得分:6)
你可以将分子乘以一个大的10 ^ N并坚持使用任意精度的整数。
修改
我的意思是:> def digits(a,b,n=50): return a*10**n/b
.
> digits(1,7)
14285714285714285714285714285714285714285714285714L
Python的整数是任意精度。 Python的浮点数永远不会是任意精度。 (你必须使用Decimal,正如另一个答案所指出的那样)
答案 2 :(得分: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"
进行打印将为您提供更精确的幻觉。
答案 3 :(得分:2)
使用gmpy:
>>> import gmpy
>>> thefraction = gmpy.mpq(1, 7)
>>> hiprecfloat = gmpy.mpf(thefraction, 256)
>>> hiprecfloat.digits(10, 50, -10, 10)
'0.14285714285714285714285714285714285714285714285714'
>>>
你不能用正常浮动来做 - 它们只有50位数的精度不够!我想有一种方法可以用fractions.Fraction
来做(2.6或更好),但我不熟悉任何格式化它而不是'1/7'
(在你的情况下不是很有用!) )。