Question

Je veux 1/7 avec une meilleure précision, mais il m'a tronqué. Comment puis-je obtenir une meilleure précision quand je convertir un nombre rationnel?

>>> str(1.0/7)[:50]
'0.142857142857'
Était-ce utile?

La solution

Python dispose d'une bibliothèque intégrée pour les calculs de précision arbitraire: décimal. Par exemple:

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

Regardez le documentation Python décimal pour plus de détails. Vous pouvez modifier la précision d'être aussi haut que vous avez besoin.

Autres conseils

Vous pouvez multiplier le numérateur par un grand 10 ^ N et le bâton avec des entiers de précision arbitraire.

modifier

Je veux dire:

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

Les entiers de Python sont une précision arbitraire. Les flotteurs de Python ne sont jamais précision arbitraire. (Vous auriez à utiliser décimal, comme une autre réponse a souligné)

L'utilisation de Perl (parce que je ne peux pas écrire 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

Comme vous pouvez le vérifier à la main, la répétition des chiffres. Impression à l'aide "%.50f" vous donnera la illusion de plus de précision.

gmpy :

>>> import gmpy
>>> thefraction = gmpy.mpq(1, 7)
>>> hiprecfloat = gmpy.mpf(thefraction, 256)
>>> hiprecfloat.digits(10, 50, -10, 10)
'0.14285714285714285714285714285714285714285714285714'
>>> 

Vous ne pouvez pas le faire avec des flotteurs normaux - ils n'ont tout simplement pas assez de précision pour 50 chiffres! J'imagine qu'il ya une façon de le faire (en 2.6 ou mieux) avec fractions.Fraction, mais je ne suis pas au courant de toute façon de le formater autrement que comme '1/7' (pas très utile dans votre cas -).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top