[python] Wetenschappelijke notatie -> gewone notatie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoihoi

Ik heb een loopje dat een aantal percentages bij elkaar op telt, en dit hoort op 100% uit te komen (het gaat om aandelen van een totaal).

Nu krijg ik hier standaard 1.0E2 uit, wat ik niet wil.
Als ik daarop ga googlen vind ik:
code:
1
2
 def remove_exponent(self,d):
  return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize()


Bijna aan het einde van deze pagina:
http://docs.python.org/library/decimal.html


Prima de bima, maar het werkt niet:

code:
1
⇝  InvalidOperation: quantize result has too many digits for current context


Het gaat hier om deze code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  for name in providerNames:
   name = providerNames[counter][0]
   length = models.Session.query(func.sum(Line.Length)).filter_by(LineDiscarded='0').filter_by(ProviderName=name).first()[0]
   if length == None:
    length=0
   else:
    length/=1000
    length_pct = (Decimal(100)* Decimal(length)) / Decimal(c.length_no_discarded)

   providerStats.append((name,length,length_pct))
   counter=counter+1
   total_length+=length
   total_pct+=length_pct

  total_pct = self.remove_exponent(total_pct)



De nauwkeurigheid is niet relevant: aan het eind van het verhaal komt er 100% uit. Als dat niet het geval (of dat nou 96.93333% of 5% is, boeit echt niet) dan is er iets fout.

Hoe kan ik dit het beste oplossen? Het is mij niet helemaal duidelijk waarom deze functie uit de manual niet werkt.

Ik heb elektra-inbouwmaterialen over? Kopen? Zie: hier


Acties:
  • 0 Henk 'm!

  • Semyon
  • Registratie: April 2001
  • Laatst online: 13:38
Boudewijn schreef op dinsdag 27 april 2010 @ 03:02:
Hoihoi

Ik heb een loopje dat een aantal percentages bij elkaar op telt, en dit hoort op 100% uit te komen (het gaat om aandelen van een totaal).

Nu krijg ik hier standaard 1.0E2 uit, wat ik niet wil.
Misschien begrijp ik je wel niet helemaal, maar 1.0E2 is toch gewoon 100.0?


code:
1
2
3
4
5
6
7
$ python
Python 2.5.4 (r254:67916, Jul  6 2009, 17:49:32) 
>>> x=100.0
>>> print x 
100.0
>>> print "%e" %x
1.000000e+02


Zoals je ziet is de waarde van de variable onveranderd, het is alleen hoe je het afdrukt of dat 100.0 of 1.0E2 is.
Maar de waarde in de float (die natuurlijk er binair heel anders uitziet) is natuurlijk hetzelfde.

Het lijkte me dan ook dat je niet moet proberen de exponent er af te halen ofzo, maar gewoon als je het naar een string omzet (wat gebeurt als je print) om het dan op die manier te doen die jij wilt.

Voor python is 1.0e+2 gewoon hetzelfde als 100.0
Hoe kan je dan willen dat er 100.0 uitkomt maar niet 100.0 (wathetzelfde is als 1.0E+2)?


code:
1
2
>>> 1.0E+2==100.0
True


Dat ga je op een variable niveau niet oplossen, het wordt niet in de variable opgeslagen of het later als het geprint moet worden via notatie A of notatie B moet gebeuren. De variable houdt alleen de waarde.

Misschien begrijp ik je verkeerd?

[ Voor 10% gewijzigd door Semyon op 27-04-2010 04:24 ]

Only when it is dark enough, can you see the stars


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 00:15
Heeft het niet gewoon met de precisie van je context te maken? De enige manier waarop ik je probleem kan reproduceren is als ik eerst de precisie handmatig op 2 zet:
Python:
1
2
3
4
5
from decimal import *
getcontext().prec=2
print(Decimal(50) + Decimal(50))  # 1.0E+2
getcontext().prec=3
print(Decimal(50) + Decimal(50))  # 100

Maar standaard is de precisie best hoog, dus ik vermoed dat je 'm zelf toch echt lager hebt gezet. Als je 'm lager had gezet om op hele percentages af te ronden (bijvoorbeeld) is het vermoedelijk een beter idee om de precisie met rust te laten en de waarden in kwestie in plaats daarvan af te ronden (met quantize() bijvoorbeeld). De globale executie-context wijzigen t.b.v. wat lokale berekeningen is nasty.

edit:
Of natuurlijk een lokale context gebruiken... wordt er ook allemaal niet mooier op.

[ Voor 32% gewijzigd door Soultaker op 27-04-2010 04:53 ]


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Semyon schreef op dinsdag 27 april 2010 @ 04:21:
[...]


Misschien begrijp ik je wel niet helemaal, maar 1.0E2 is toch gewoon 100.0?
Klopt.
Zoals je ziet is de waarde van de variable onveranderd, het is alleen hoe je het afdrukt of dat 100.0 of 1.0E2 is.
Maar de waarde in de float (die natuurlijk er binair heel anders uitziet) is natuurlijk hetzelfde.

Het lijkte me dan ook dat je niet moet proberen de exponent er af te halen ofzo, maar gewoon als je het naar een string omzet (wat gebeurt als je print) om het dan op die manier te doen die jij wilt.

Voor python is 1.0e+2 gewoon hetzelfde als 100.0
Hoe kan je dan willen dat er 100.0 uitkomt maar niet 100.0 (wathetzelfde is als 1.0E+2)?
Leesbaarheid en consistentie van de GUI. De overige getallen zijn ook niet-wetenschappelijk uitgedrukt.
Misschien begrijp ik je verkeerd?
Het is puur cosmetisch ;).

Ik heb handmatig de precisie op 3 gezet en nu werkt het wel goed. Raar dat moest maar voor andere variabelen wel goed ging.

Edit: En inderdaad is hij op 2 gezet om wat andere dingen goed te laten verlopen. Tijd voor quantize dus.

[ Voor 4% gewijzigd door Boudewijn op 30-04-2010 01:43 ]

Ik heb elektra-inbouwmaterialen over? Kopen? Zie: hier


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Euhm, waarom zou je het getal aanpassen voor de representatie? Je kunt beter gewoon de juiste print formatting functies gebruiken om je getallen weer te geven? Ik ken Python niet zo goed, maar die heeft daar vast zn eigen functies voor.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Ja dat gebeurt in die context. Ik weet waar je leest dat ik het getal zelf aan wil passen?

Ik heb elektra-inbouwmaterialen over? Kopen? Zie: hier

Pagina: 1