我想获得1/7
更高的精度,但它被截断了。转换有理数时如何获得更好的精度?
>>> str(1.0/7)[:50]
'0.142857142857'
我想获得1/7
更高的精度,但它被截断了。转换有理数时如何获得更好的精度?
>>> str(1.0/7)[:50]
'0.142857142857'
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 文档以获取更多详细信息。您可以根据需要将精度更改为尽可能高。
您可以将分子乘以一个大的 10^N 并坚持使用任意精度的整数。
编辑
我的意思是:
> def digits(a,b,n=50): return a*10**n/b
.
> digits(1,7)
14285714285714285714285714285714285714285714285714L
Python 的整数是任意精度的。Python 的浮点数从来都不是任意精度的。(正如另一个答案指出的那样,您必须使用十进制)
使用 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"
会给你更精确的错觉。
使用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'
(在你的情况下不是很有用!-)。