Ich habe versucht, eine Reihe von Zahlen von -100 bis 0 auf einen Bereich von 10 bis 100 zu normalisieren, und hatte nur Probleme zu bemerken, dass dies selbst ohne Variablen nicht so bewertet, wie ich es erwarten würde:
>>> (20-10) / (100-10)
0
Die Float-Division funktioniert auch nicht:
>>> float((20-10) / (100-10))
0.0
Wenn eine Seite der Division auf einen Schwimmer geworfen wird, funktioniert dies:
>>> (20-10) / float((100-10))
0.1111111111111111
Jede Seite im ersten Beispiel wird als int ausgewertet, was bedeutet, dass die endgültige Antwort in ein int umgewandelt wird. Da 0,111 kleiner als 0,5 ist, wird auf 0 gerundet. Es ist meiner Meinung nach nicht transparent, aber ich denke, so ist es.
Was ist die Erklärung?
python
math
python-2.x
Adam Nelson
quelle
quelle
Antworten:
Sie verwenden Python 2.x, bei dem ganzzahlige Unterteilungen abgeschnitten werden, anstatt eine Gleitkommazahl zu werden.
Sie sollten einen von ihnen zu einem machen
float
:oder
from __future__ import division
, was die Kräfte zwingt/
, das Verhalten von Python 3.x zu übernehmen, das immer einen Float zurückgibt.quelle
from __future__ import division
, können Sie das alte Teilungsverhalten im C-Stil durch Verwendung von zwei Schrägstrichen erhalten (z. B.1 // 2
ergibt dies 0). Siehe Pep 238 Ändern des Divisionsoperators__future__
. In beiden Python 2 und 3//
bezieht sich auf__floordiv__()
standardmäßig.Sie setzen Ganzzahlen ein, sodass Python Ihnen eine Ganzzahl zurückgibt :
Wenn Sie dies später in einen Float umwandeln, wurde die Rundung bereits durchgeführt, mit anderen Worten, 0 Integer wird immer zu 0 Float.
Wenn Sie Floats auf beiden Seiten der Division verwenden, gibt Python Ihnen die Antwort, die Sie erwarten.
Also in deinem Fall:
quelle
Sie müssen es in einen Float ändern, bevor Sie die Division durchführen. Das ist:
quelle
In Python 2.7 ist der
/
Operator eine Ganzzahldivision, wenn Eingaben Ganzzahlen sind:In Python 3.3 ist der
/
Operator eine Float-Division, auch wenn die Eingaben ganzzahlig sind.Für die Ganzzahldivision in Python 3 verwenden wir die
//
Operator.Das
//
Operator ist sowohl in Python 2.7 als auch in Python 3.3 ein Ganzzahldivisionsoperator.In Python 2.7 und Python 3.3:
Sehen Sie sich jetzt den Vergleich an
Für das obige Programm ist die Ausgabe in Python 2.7 False und in Python 3.3 True.
In Python 2.7 ist a = 1,75 und b = 1.
In Python 3.3 ist a = 1,75 und b = 1,75, nur weil
/
es sich um eine Float-Division handelt.quelle
Dies hängt mit der von Ihnen verwendeten Python-Version zusammen. Grundsätzlich wird das C-Verhalten übernommen: Wenn Sie zwei Ganzzahlen teilen, werden die Ergebnisse auf eine Ganzzahl abgerundet. Denken Sie auch daran, dass Python die Operationen von links nach rechts ausführt, was beim Typisieren eine Rolle spielt.
Beispiel: Da dies eine Frage ist, die mir bei arithmetischen Operationen immer im Kopf auftaucht (sollte ich in float konvertieren und welche Zahl), wird ein Beispiel aus diesem Aspekt vorgestellt:
Wenn wir ganze Zahlen teilen, wird es nicht überraschend, dass sie niedriger gerundet werden.
Wenn wir die letzte zu schwebende Ganzzahl typisieren, erhalten wir immer noch Null, da zu dem Zeitpunkt, an dem unsere Zahl durch das Gleitkomma geteilt wird, aufgrund der Ganzzahldivision bereits 0 geworden ist.
Gleiches Szenario wie oben, jedoch Verschiebung des Float-Typs etwas näher an die linke Seite.
Wenn wir schließlich die erste Ganzzahl eingeben, die schwebt, ist das Ergebnis das gewünschte, da wir ausgehend von der ersten Division, dh der ganz linken, Gleitkommazahlen verwenden.
Extra 1: Wenn Sie versuchen, dies zu beantworten, um die arithmetische Auswertung zu verbessern, sollten Sie dies überprüfen
Extra 2: Bitte beachten Sie das folgende Szenario:
quelle
Angeben eines Floats durch Platzieren eines '.' Nach der Nummer wird es auch standardmäßig schweben.
quelle
Lassen Sie mindestens einen von ihnen schweben, dann wird es eine Float-Division sein, keine ganze Zahl:
Das Ergebnis zum Schweben zu bringen ist zu spät.
quelle
In Python
cv2
nicht aktualisiert die Divisionsberechnung. Sie müssen alsofrom __future__ import division
in die erste Zeile des Programms aufnehmen.quelle
In jedem Fall ist es eine ganzzahlige Division. 10/90 = 0. Im zweiten Fall werfen Sie lediglich 0 auf einen Float.
Versuchen Sie, einen der Operanden von "/" als Float zu verwenden:
quelle
Sie werfen, um zu schweben, nachdem die Teilung bereits in Ihrem zweiten Beispiel stattgefunden hat. Versuche dies:
quelle
Ich bin etwas überrascht, dass niemand erwähnt hat, dass das Originalplakat möglicherweise rationale Zahlen ergeben hätte. Wenn Sie daran interessiert sind, hat das Python-basierte Programm Sage Ihren Rücken . (Derzeit basiert es noch auf Python 2.x, obwohl 3.x im Gange ist.)
Dies ist nicht für jeden eine Lösung, da einige Vorbereitungen getroffen werden, sodass diese Zahlen nicht
int
s, sondern Sage-Integer
Klassenelemente sind. Erwähnenswert als Teil des Python-Ökosystems.quelle
Persönlich habe ich es vorgezogen,
1. *
ganz am Anfang ein einzufügen . Der Ausdruck wird also ungefähr so:Da mache ich immer eine Division für eine Formel wie:
Es ist also unmöglich, einfach ein
.0
Like hinzuzufügen20.0
. Und in meinem Fall kann das Umwickeln mit afloat()
ein wenig an Lesbarkeit verlieren.quelle