Domanda

Voglio ottenere 1/7 con una migliore precisione, ma ha ottenuto troncato. Come posso ottenere una migliore precisione quando si converte un numero razionale?

>>> str(1.0/7)[:50]
'0.142857142857'
È stato utile?

Soluzione

Python ha un built-in libreria per calcoli di precisione arbitraria: decimale. Ad esempio:

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

Guardate il Python decimale documentazione per ulteriori dettagli. È possibile modificare la precisione di essere il più alto di cui hai bisogno.

Altri suggerimenti

Si potrebbe moltiplicare il numeratore per un grande 10 ^ N e bastone con interi precisione arbitraria.

Modifica

Voglio dire:

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

interi di Python sono precisione arbitraria. carri di Python sono precisione mai arbitraria. (Dovreste usare decimale, come un'altra risposta ha sottolineato)

Utilizzo di Perl (perché non riesco a scrivere 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

Come è possibile verificare a mano, la ripetizione cifre. Stampa con "%.50f" vi darà la illusione di maggiore precisione.

gmpy :

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

Non si può farlo con galleggianti normali - semplicemente non hanno abbastanza di precisione per 50 cifre! Immagino che ci sia un modo per farlo (in 2.6 o superiore) con fractions.Fraction, ma io non sono a conoscenza un modo per formattare altrimenti che come '1/7' (non molto utile nel vostro caso -!).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top