2015-11-25 8 views
9

Ich bekomme einen Float, indem ich zwei Zahlen dividiere. Ich weiß, dass die Zahlen teilbar sind, also habe ich immer eine Ganzzahl, nur vom Typ float. Ich brauche jedoch einen tatsächlichen Int-Typ. Ich weiß, dass int() die Dezimalstellen streift (d. H. Bodenrundung). Ich bin besorgt, da Schwimmer sind nicht genau, wenn ich z. int(12./3) oder int(round(12./3)) kann es als 3 statt 4 enden, weil die Gleitkommadarstellung von 4 3.9999999593519561 sein könnte (es ist nicht, nur ein Beispiel).Wird eine "Ganzzahl" float zu int immer die nächste ganze Zahl zurückgeben?

Wird dies jemals passieren und kann ich sicherstellen, dass es nicht geschieht?

(Ich frage, weil während ein numpy Array Umformen, ich eine Warnung bekam zu sagen, dass die Form ganzer Zahlen sein müssen, nicht schwimmt.)

+4

Warum verwenden Sie nicht einfach Ganzzahldivision? – lejlot

+0

Ja, ich habe gerade gleich nach der Veröffentlichung daran gedacht. War im Begriff, die Frage zu aktualisieren, aber ich lasse deinen Kommentar stattdessen sprechen. – cmeeren

+0

Wenn ich z.B. 3,5/0,5 dann ist das nicht möglich. (Ich tue nicht, ich dividiere zwei ganze Zahlen, aber um der Argumentation willen ...) – cmeeren

Antwort

4

Casting ein float auf ein integer den Wert abschneidet, also, wenn Sie 3.999998 , und Sie werfen es auf eine integer, erhalten Sie 3.

Um dies zu verhindern, runden Sie das Ergebnis ab. int(round(3.99998)) = 4, da die Rundenfunktion immer einen genau ganzzahligen Wert zurückgibt.

+0

Wie kann die Rundenfunktion einen genau ganzzahligen Wert zurückgeben, wenn sie einen Gleitkommawert zurückgibt? – cmeeren

+0

Ein Float ist wie Dezimalzahl mit begrenzter Länge, außer mit Binärziffern anstelle von Ziffern 0-9. Es kann ganzzahlige Werte wie 3453.0 genau halten.Es gibt viele Zahlen, die es nicht genau halten kann, wie 1/3 = 0,3333 ..., weil seine Länge begrenzt ist. –

+1

@cmeeren: Der Grund für diese Antwort ist richtig, ** für Ihre Frage **. Es ist wahr, dass "rund" keine "intuitiven" Ergebnisse ergibt, wenn der Gleitkommawert nahe an einer Rundungsgrenze liegt, wie zum Beispiel "rund (2.675, 2)" (dieses Beispiel ist in der Dokumentation angegeben). Aber Ihre Frage besagt ausdrücklich, dass Sie wissen, dass Ihre Werte integral sein sollten, und diese werden wie erwartet abgerundet. –

1

Die Rundung kann simuliert werden, indem dem betreffenden Wert 0,5 hinzugefügt wird. Zum Beispiel:

>>> int(3.4) 
3 
>>> int(3.7) 
3 
>>> int(3.4 + 0.5) # 3.9 
3 
>>> int(3.7 + 0.5) # 4.2 
4 
+0

In C scheitert das Addieren von 0.5 zum Runden einer Zahl für 1) viele negative Zahlen, 2) Die Zahl gerade kleiner als 0.5, 3) viele 'float'numbers mit ULP von 0.5 4) viele 'float'-Werte mit ULP von 1.0. Verdächtige ähnliche Probleme mit Python. – chux

+0

Keiner dieser Sonderfälle wird durch den OP-Code generiert. – chepner

1

ich landete mit Integer-Division (a//b), da ich ganze Zahlen geteilt. Hätte nicht funktioniert, wenn ich z. 3,5/0,5 = 7 obwohl.

Verwandte Themen