欧拉第26题,如何更精确地将有理数转换为字符串?

7 投票
4 回答
1022 浏览
提问于 2025-04-15 15:55

我想要更精确地得到 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文档。你可以根据需要调整计算的精度,做到多高都可以。

撰写回答