2010-02-05 6 views
0

Je veux afficher dans une page HTML des données avec des erreurs, par exemple:impression belle valeur avec l'erreur

 
(value, error) -> string 
(123, 12) -> (12 +- 1) x 10^1 
(4234.3, 2) -> (4234 +- 2) 
(0.02312, 0.003) -> (23 +- 3) x 10^-3 

J'ai produit ceci:


from math import log10 
def format_value_error(value,error): 
    E = int(log10(abs(error))) 
    val = float(value)/10**E 
    err = float(error)/10**E 
    return "(%f +- %f) x 10^%d" % (val, err, E) 

mais j'ai quelques difficultés avec arrondi. Y a-t-il des bibliothèques avec cette fonctionnalité?

Répondre

3

Je ne sais pas exactement ce que vous voulez, mais je suppose que vous voulez simplement arrondir les nombres que vous avez à l'entier le plus proche? Si oui, vous pouvez utiliser la fonction intégrée round:

>>> int(round(1.5)) 
2 

est ici l'aide:

>>> help(round) 
Help on built-in function round in module __builtin__: 

round(...) 
    round(number[, ndigits]) -> floating point number 

    Round a number to a given precision in decimal digits (default 0 digits). 
    This always returns a floating point number. Precision may be negative. 

Si vous voulez arrondir vous pouvez utiliser floor de math. Je pense que vous voulez vraiment l'utiliser après avoir pris le logarithme, plutôt que de simplement lancer vers int, comme int (-0.5) est 0, pas -1 comme vous voulez. Voici une version modifiée de votre programme que je pense ne ce que vous voulez:

from math import log10, floor 
def format_value_error(value,error): 
    E = int(floor(log10(error))) 
    val = int(round(float(value)/10**E)) 
    err = int(round(float(error)/10**E)) 
    return "(%d +- %d) x 10^%d" % (val, err, E) 

print format_value_error(123, 12) 
print format_value_error(4234.3, 2) 
print format_value_error(0.02312, 0.003) 

Cela donne le résultat suivant:

(12 +- 1) x 10^1 
(4234 +- 2) x 10^0 
(23 +- 3) x 10^-3 

Ceci est très proche de ce que vous voulez. La seule différence est que le text x 10^0 ne devrait pas être imprimé, mais je suis sûr que vous pouvez trouver une solution pour cela. :)

+0

il est plus compliqué. Je connais la fonction round, mais j'ai besoin de calculer les seconds arguments pour arrondir (ndigits) –

+0

@wiso: Est-ce que ma réponse mise à jour vous aide? –

+0

très bien! Merci –

0

Vous pouvez utiliser ce dans la solution de Mark à blanc l'exposant pour 10^0

if E: 
     return "(%d +- %d) x 10^%d" % (val, err, E) 
    else: 
     return "(%d +- %d)" % (val, err)