Seite 1 von 1

binäre Gleitkommazahlen zu normalen Dezimalzahlen

Verfasst: Freitag 2. März 2007, 14:41
von Jay-Pi
Hallo,

ich bin heute am verzweifeln an der Darstellung von float/double Zahlen.

Ich habe Zahlen im Binärformat vorliegen und möchte das ganze am Ende in eine Text, XML oder sonstwas Form bringen, am besten im deutschen Format mit Komma.

Ich scheitere aber gerade daran, das die Werte sobald ich sie in ein Array packe im "binär" Format gespeichert und hinterher so ausgegeben werden.

Ziel:
1.0 => 1
5.9 => 5,9

Code: Alles auswählen

#!/usr/bin/env python
from struct import *

b0 = 1
b1 = 0
b2 = 100
b3 = 64

ieee754 = pack('8B', 0, 0, 0, 0, b0 & 0xFC, b1, b2, b3)
result , = unpack('<d', ieee754)
result /= 100

print result
#>>> 1.6

a= {}
a[0] = result
a[1] = 'test'
a[2] = 5.9

print a
#>>> {0: 1.6000000000000001, 1: 'test', 2: 5.9000000000000004}
Gruss
JP

Verfasst: Freitag 2. März 2007, 15:46
von HWK
Das hat nichts mit pack/unpack zu tun. Floats an sich habe eine gewisse Ungenauigkeit. Entweder rundest Du manuell auf die gewünschte Genauigkeit oder Du verwendest das decimal-Standardmodul. Es gibt im Forum sicher auch zahlreiche Threads, die das noch weitergehend erklären.
MfG
HWK

decimal

Verfasst: Freitag 2. März 2007, 15:50
von Jay-Pi
Hallo,

ich habe mir das decimal Modul in der offiziellen Python Doku bereits angeguckt, allerdings habe ich die Verwendung noch nicht ganz verstdanden.

bei decimal.Decimal(1.6)

bekomme ich am Ende im Array nur sowas wie {0: 'Decimal("1.6")', ... }
Ich suche mich nächste Woche mal durch.

Gruss
JP

Verfasst: Freitag 2. März 2007, 15:56
von HWK
Z.B. so:

Code: Alles auswählen

>>> a = decimal.Decimal(str(1.6))
>>> a
Decimal("1.6")
>>> int(a)
1
>>> float(a)
1.6000000000000001
>>> str(a)
'1.6'
MfG
HWK

Lösung

Verfasst: Montag 5. März 2007, 13:56
von Jay-Pi
Hallo,

ich habe jetzt meinen "Fehler" gefunden.

Mein Problem bestand eigentlich garnicht in der Zwischenspeicherung der Daten, sondern in der finalen Ausgabe.

In dem Script, welches die Werte am Ende Kommasperiert ausgibt war ein repr() für die Ausgabe von Zahlen, bzw nicht unicode gespeicherten werte. Allerdings mit dem Alias `v`. (Accent Grave)

Code: Alles auswählen

v = 1.6

if isinstance(v, unicode):
   v = v.encode('utf-8', 'backslashreplace')
else:
   v = `v`

print v
#>>> 1.6000000000000001
Ich werde das v = `v` durch str(v) ersetzen oder einfach nur print benutzen.

Danke für die Hilfestellung.

Gruss
JP