Эйлер # 26, как преобразовать рациональное число в строку с большей точностью? - PullRequest
7 голосов
/ 12 ноября 2009

Я хочу получить 1/7 с большей точностью, но оно обрезано. Как я могу получить лучшую точность при преобразовании рационального числа?

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

Ответы [ 4 ]

9 голосов
/ 12 ноября 2009

В Python есть встроенная библиотека для вычислений произвольной точности: десятичная. Например:

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

Посмотрите Десятичная документация Python для более подробной информации. Вы можете изменить точность, чтобы она была настолько высокой, насколько вам нужно.

6 голосов
/ 12 ноября 2009

Вы можете умножить числитель на большое 10 ^ N и использовать целые числа произвольной точности.

EDIT

Я имею в виду:

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

Целые числа Python имеют произвольную точность. Плавания Python никогда не бывают произвольной точности. (вы должны использовать десятичную дробь, как указал другой ответ)

3 голосов
/ 12 ноября 2009

Использование 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" даст вам иллюзию большей точности.

2 голосов
/ 12 ноября 2009

С 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, но я не знаком ни с каким способом отформатировать его иначе, чем '1/7' (не очень полезно в вашем случае! -).

...