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
Anfängerfrage: Kommastellen reduzieren
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
>>>
Zuletzt geändert von nomnom am Freitag 3. Dezember 2010, 16:19, insgesamt 1-mal geändert.
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
Floats vergleicht man normalerweise über ein Epsilon.
Schau mal hier:
http://pyfaq.infogami.com/why-are-float ... inaccurate
Das macht man i.d.R. über einen Treshold/Schwellwert:
Edit: Das ist das selbe wie mit dem Epsilon, aber durch `abs` etwas eleganter.
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
Zuletzt geändert von ms4py am Freitag 3. Dezember 2010, 16:23, insgesamt 1-mal geändert.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher
http://ms4py.org/
Gerhard Kocher
http://ms4py.org/
Ja, stimmt. Floats sind total ungenau.
Schau dir mal das decimal-Modul an.
Code: Alles auswählen
>>> 1 - 0.9
0.099999999999999978
>>> Code: Alles auswählen
>>> decimal.Decimal('1') - decimal.Decimal('0.9')
Decimal('0.1')
>>> @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
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
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
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
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Kleine Korrektur: Du meinst Gleichheit, nicht Identität.Selda hat geschrieben:ich möchte zwei float - Zahlen auslesen und sehen, ob sie identisch sind.
Was du wirklich suchst ist ein Treshold, wie von ms4py vorgeschlagen.Selda hat geschrieben:Wie kann ich die Anzahl an Stellen z.b. auf 4 reduzieren?
Nur der Vollstaendigkeit halber - bitte nicht nutzen:
Stichwort: Stringformatting.
`"%.4f"` fuer Floats mit 4 Nachkommastellen.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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!
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!
Ich denke eher, dass das in der Natur von Floats liegt.Aber das ist wohl ein ArcGIS-spezifisches Problem.
Der Artikel, den ich im zweiten Post verlinkt habe, gibt dir sehr gute Einblicke in dieses Thema, auch wenn er zugegebenermassen sehr lang ist
