欧拉第26题,如何更精确地将有理数转换为字符串?
我想要更精确地得到 1/7
的结果,但它被截断了。有什么方法可以在转换一个分数时获得更好的精度呢?
>>> str(1.0/7)[:50]
'0.142857142857'
4 个回答
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"
来打印,会让你觉得精度更高,其实只是表面现象。
6
你可以把分子乘以一个很大的10的N次方,然后用任意精度的整数来处理。
补充说明
我的意思是:
> def digits(a,b,n=50): return a*10**n/b
.
> digits(1,7)
14285714285714285714285714285714285714285714285714L
在Python中,整数是可以任意精度的,也就是说它们可以非常大而不会出错。而Python的浮点数(小数)就不是这样,它们的精度是有限的。(如果需要更高的精度,你需要使用Decimal类型,正如其他回答所提到的)
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文档。你可以根据需要调整计算的精度,做到多高都可以。