I'm machen ein Programm, das aus Gründen, die nicht erklärt werden müssen, erfordert ein Float in eine Zeichenfolge konvertiert werden, um mit len() gezählt werden. Allerdings führt str(float(x)) dazu, dass x gerundet wird, wenn es in einen String konvertiert wird, was die ganze Sache durcheinander bringt. Kennt jemand eine Lösung für dieses Problem? Hier ist der Code, der verwendet wird, wenn Sie es wissen wollen:
len(str(float(x)/3))
Beim Umgang mit Fließkommazahlen ist eine gewisse Rundung oft unvermeidlich. Das liegt daran, dass Zahlen, die Sie exakt zur Basis 10 ausdrücken können, nicht immer exakt zur Basis 2 (die Ihr Computer verwendet) ausgedrückt werden können.
Zum Beispiel:
>>> .1
0.10000000000000001
In diesem Fall wird .1 mit repr
in eine Zeichenkette umgewandelt:
>>> repr(.1)
'0.10000000000000001'
Ich glaube, dass Python die letzten paar Ziffern abschneidet, wenn Sie str() verwenden, um dieses Problem zu umgehen, aber das ist nur eine partielle Lösung, die nicht ausreicht, um zu verstehen, was vor sich geht.
>>> str(.1)
'0.1'
Ich bin mir nicht sicher, welche Probleme die Rundung Ihnen bereitet. Vielleicht wäre es besser, wenn Sie Ihre Ausgabe mit Hilfe der String-Formatierung genauer steuern könnten?
z.B..
>>> '%.5f' % .1
'0.10000'
>>> '%.5f' % .12345678
'0.12346'
len(repr(float(x)/3))
Ich muss jedoch sagen, dass dies nicht so zuverlässig ist, wie Sie denken.
Fließkommazahlen werden als Dezimalzahlen eingegeben/angezeigt, aber Ihr Computer (genauer gesagt, Ihre Standard-C-Bibliothek) speichert sie als Binärzahlen. Dieser Übergang hat einige Nebeneffekte:
>>> print len(repr(0.1))
19
>>> print repr(0.1)
0.10000000000000001
Die Erklärung, warum dies geschieht, finden Sie in diesem Kapitel des Python-Tutorials.
Eine Lösung wäre die Verwendung eines Typs, der speziell Dezimalzahlen verfolgt, wie z.B. decimal.Decimal
in Python's:
>>> print len(str(decimal.Decimal('0.1')))
3
In anderen Antworten wurde bereits darauf hingewiesen, dass die Darstellung von Gleitkommazahlen, gelinde gesagt, ein heikles Thema ist.
Da Sie nicht genug Kontext in Ihrer Frage angeben, kann ich nicht wissen, ob das Dezimalmodul für Ihre Bedürfnisse nützlich sein kann:
http://docs.python.org/library/decimal.html
Unter anderem können Sie explizit die Genauigkeit angeben, die Sie erhalten möchten (aus den Unterlagen):
>>> getcontext().prec = 6
>>> Decimal('3.0')
Decimal('3.0')
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')
Ein einfaches Beispiel aus meiner Eingabeaufforderung (python 2.6):
>>> import decimal
>>> a = decimal.Decimal('10.000000001')
>>> a
Decimal('10.000000001')
>>> print a
10.000000001
>>> b = decimal.Decimal('10.00000000000000000000000000900000002')
>>> print b
10.00000000000000000000000000900000002
>>> print str(b)
10.00000000000000000000000000900000002
>>> len(str(b/decimal.Decimal('3.0')))
29
Vielleicht kann das helfen? decimal ist in python stdlib seit 2.4, mit Ergänzungen in python 2.6.
Hoffentlich hilft das, Francesco