Seite 1 von 1
Anfängerfrage: Kommastellen reduzieren
Verfasst: Freitag 3. Dezember 2010, 16:06
von Selda
Hallöchen,
ich möchte zwei float - Zahlen auslesen und sehen, ob sie identisch sind.
Das Problem dabei ist, dass sie eine unterschiedliche Anzahl an Kommastellen haben.
Wie kann ich die Anzahl an Stellen z.b. auf 4 reduzieren? Integer oder runden würde mir nichts nützen, ich muss die Zahl hinten einfach abschneiden können. Geht das irgendwie?
In Text umwandeln vorher wäre auch ok.
Danke für jede Hilfe,
Selda
Re: Anfängerfrage: Kommastellen reduzieren
Verfasst: Freitag 3. Dezember 2010, 16:17
von nomnom
Das ist doch komisch. Identische Zahlen haben doch die gleiche Anzahl an Nachkommastellen (unter anderem), die Nullen am Ende kannst du dir ja wegdenken. Und wenn es keine Nullen sind, die am Ende die Gleichheit stören, dann sind die Zahlen nicht identisch.
Code: Alles auswählen
>>> 1.00
1.0
>>> 1.000
1.0
>>> 1.0000 == 1.0000000000000
True
>>>
Re: Anfängerfrage: Kommastellen reduzieren
Verfasst: Freitag 3. Dezember 2010, 16:19
von syntor
Sobald du aber rechnest, hast du Probleme mit Floats.
Floats vergleicht man normalerweise über ein Epsilon.
Schau mal hier:
http://pyfaq.infogami.com/why-are-float ... inaccurate
Re: Anfängerfrage: Kommastellen reduzieren
Verfasst: Freitag 3. Dezember 2010, 16:20
von ms4py
Das macht man i.d.R. über einen Treshold/Schwellwert:
Code: Alles auswählen
In [8]: a = 0.00001
In [9]: b = 0.00002
In [10]: threshold = 10**-4
In [11]: abs(a-b) < threshold
Out[11]: True
Edit: Das ist das selbe wie mit dem Epsilon, aber durch `abs` etwas eleganter.
Re: Anfängerfrage: Kommastellen reduzieren
Verfasst: Freitag 3. Dezember 2010, 16:22
von nomnom
Ja, stimmt. Floats sind total ungenau.
Schau dir mal das decimal-Modul an.
Code: Alles auswählen
>>> decimal.Decimal('1') - decimal.Decimal('0.9')
Decimal('0.1')
>>>
Re: Anfängerfrage: Kommastellen reduzieren
Verfasst: Freitag 3. Dezember 2010, 16:25
von syntor
@ms4py: Ich hatte ja auch keine Implementation angegeben

Aber in der Mathematik nennt man es einfach Epsilon, wenn du numerische Näherungsverfahren einsetzt.
Hier noch ein guter Artikel zu dem Thema:
What Every Computer Scientist Should Know About Floating-Point Arithmetic
//edit oder doch, habs nur überflogen

Re: Anfängerfrage: Kommastellen reduzieren
Verfasst: Freitag 3. Dezember 2010, 16:27
von Selda
Wow, ihr seid ja schnell
Danke, mehrere Vorschläge, die ich gleich mal ausprobieren werde.
Ja, mein Problem ist, dass ich die Zahlen aus Geometrie-Objekten aus ArcGIS auslese, und komischerweise haben die eine unterschiedliche Anzahl an Stellen, je nachdem ob es Koordinaten von einem Punkt oder von den Endpunkten einer Linie sind. Keine Ahnung warum, aber ich muss halt wissen, ob der Punkt mit dem Endpunkt der Linie übereinstimmt auf eine gewisse Genauigkeit.
Danke für die schnellen Antworten!
Selda
Re: Anfängerfrage: Kommastellen reduzieren
Verfasst: Freitag 3. Dezember 2010, 16:27
von cofi
Selda hat geschrieben:ich möchte zwei float - Zahlen auslesen und sehen, ob sie identisch sind.
Kleine Korrektur: Du meinst Gleichheit, nicht Identität.
Selda hat geschrieben:Wie kann ich die Anzahl an Stellen z.b. auf 4 reduzieren?
Was du wirklich suchst ist ein Treshold, wie von ms4py vorgeschlagen.
Nur der Vollstaendigkeit halber - bitte nicht nutzen:
Stichwort: Stringformatting.
`"%.4f"` fuer Floats mit 4 Nachkommastellen.
Re: Anfängerfrage: Kommastellen reduzieren
Verfasst: Freitag 3. Dezember 2010, 16:34
von Selda
Ja, da haste wohl recht mit der Gleichheit.
Ich dachte "identisch", weil ich an dem Punkt die Linie zerschnitten habe, insofern müsste der Punkt und der Anfangspunkt der Linie eigentlich identisch sein, aber komischerweise wird wie gesagt eine unterschiedliche Anzahl von Kommastellen ausgelesen. Aber das ist wohl ein ArcGIS-spezifisches Problem.
Danke allen!
Re: Anfängerfrage: Kommastellen reduzieren
Verfasst: Freitag 3. Dezember 2010, 17:07
von syntor
Aber das ist wohl ein ArcGIS-spezifisches Problem.
Ich denke eher, dass das in der Natur von Floats liegt.
Der Artikel, den ich im zweiten Post verlinkt habe, gibt dir sehr gute Einblicke in dieses Thema, auch wenn er zugegebenermassen sehr lang ist
