2017-06-13 4 views
0

Ich werde mein Problem mit gutem Beispiel erklären:Abrundungsfunktion ist die Beseitigung Integer wissenschaftliche Notation, Python

>>> #In this case, I get unwanted result 
>>> k = 20685671025767659927959422028/2580360422 
>>> k 
8.016582043889239e+18 
>>> math.floor(k) 
8016582043889239040 
>>> #I dont want this to happen ^^, let it remain 8.016582043889239e+18 
>>> #The following case though, is fine 
>>> k2 = 5/6 
>>> k2 
0.8333333333333334 
>>> math.floor(k2) 
0 

Wie kann ich machen Math.floor nicht die wissenschaftlichen Zahlen notiert Bodenbelag? Gibt es eine Regel, für die Zahlen in einer wissenschaftlichen Notation dargestellt werden (ich denke, es wäre eine gewisse Grenze).


EDIT:

Ich dachte zuerst, dass die Math.floor Funktion einen Genauigkeitsverlust verursacht wurde, aber es stellt sich heraus, dass die erste Berechnung selbst die Berechnung der Genauigkeit verloren, was wirklich verwirrt hatte mich,

>>> 20685671025767659927959422028/2580360422 
8016582043889239040 
>>> 8016582043889239040 * 2580360422 
20685671025767659370513274880 
>>> 20685671025767659927959422028 - 20685671025767659370513274880 
557446147148 
>>> 557446147148/2580360422 
216.0342184739958 
>>> ##this is >1, meaning I lost quite a bit of information, and it was not due to the flooring 

mein Problem ist also jetzt, wie das tatsächliche Ergebnis der Division zu bekommen: es kann leicht hier zu sehen. Ich schaute auf den folgenden Thread: How to print all digits of a large number in python? Aber aus irgendeinem Grund habe ich nicht das gleiche Ergebnis erhalten.


EDIT: ich eine einfache Lösung für die Teilgenauigkeit Problem hier gefunden: How to manage division of huge numbers in Python? Anscheinend ist der // Operator ein int kehrt dann eher float, die neben keine Größenbeschränkung muss der Speicher des Geräts.

+0

_ "Ich denke, es wäre eine bestimmte Grenze" _. Ich denke nicht. Ich habe "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999" in die interaktive Eingabeaufforderung eingegeben, und es zeigt das Ganze, obwohl es viel größer als 8e18 ist. – Kevin

+0

@Kevin versuchen, es mit etwas zu teilen – GoldenSpecOps

+0

Die Notation ist einfach eine visuelle Darstellung einer Zahl. Was eine Funktion als Parameter bekommt, ist die binäre Darstellung, die für alle Gleitkommazahlen gleich ist. – DyZ

Antwort

3

In Python 3 gibt math.floor eine ganze Zahl zurück. Ganzzahlen werden nicht in wissenschaftlicher Notation angezeigt. Einige Floats sind dargestellt mit wissenschaftlicher Notation. Wenn Sie eine wissenschaftliche Notation wünschen, versuchen Sie, zurück in Float zu konvertieren.

>>> float(math.floor(20685671025767659927959422028/2580360422)) 
8.016582043889239e+18 

Als Tadhg McDonald-Jensen zeigt an, Sie auch str.format verwenden können, eine String-Darstellung Ihrer ganzen Zahl in wissenschaftlicher Notation zu erhalten:

>>> k = 20685671025767659927959422028/2580360422 
>>> "{:e}".format(k) 
'8.016582e+18' 

Dies kann in der Tat zu praktischer sein als die Umwandlung schweben. Als allgemeine Faustregel sollten Sie einen numerischen Datentyp auswählen, der auf der benötigten Genauigkeit und dem gewünschten Bereich basiert, ohne dass Sie sich darum sorgen müssen, wie er beim Drucken aussieht.

+0

danke, es hat mir geholfen, das eigentliche Problem zu verstehen, ich habe nur die Frage bearbeitet – GoldenSpecOps

Verwandte Themen