webentwicklung-frage-antwort-db.com.de

Was ist in Python ein guter Weg, um in der Ganzzahldivision auf Null zu runden?

1/2

gibt

0

so wie es sollte. Jedoch,

-1/2

gibt

-1

, aber ich möchte, dass es in Richtung 0 rundet (d. h. ich möchte, dass -1/2 0 ist), unabhängig davon, ob es positiv oder negativ ist. Wie geht das am besten?

15
blacktrance

Machen Sie eine Gleitkommasektion und konvertieren Sie sie in ein int. Keine zusätzlichen Module erforderlich.

>>> int(float(-1)/2)
0
>>> int(float(-3)/2)
-1
>>> int(float(1)/2)
0
>>> int(float(3)/2)
1
13
Tim

Pythons voreingestellte Division von Ganzzahlen ist die Rückkehr zum Boden (gegen negative Unendlichkeit), ohne dass dies geändert werden kann. Sie können lesen den Grund des BDFL.

Um eine Aufrundung durchzuführen, verwenden Sie:

>>> a=1
>>> b=2
>>> (a+(-a%b))//b
1
>>> a,b=-1,2
>>> (a+(-a%b))//b
0

Um auf Null abzuschneiden und die Ganzzahldivision beizubehalten, verwenden Sie (a+(-a%b))//b, wenn entweder a oder b negativ ist, und die Standarddivision, wenn beide positiv sind.

Dies führt zu einer ganzzahligen Division und immer zu Null hin:

>>> a=1
>>> b=2
>>> a//b if a*b>0 else (a+(-a%b))//b
0
>>> a=-1
>>> b=2
>>> a//b if a*b>0 else (a+(-a%b))//b
0
>>> a,b=-3,2
>>> a//b if a*b>0 else (a+(-a%b))//b
-1
>>> a,b=3,2
>>> a//b if a*b>0 else (a+(-a%b))//b
1

fußnote

Interessanterweise erklärt C99, dass round to zero der Standardwert ist:

#include <stdio.h>
int main(int argc, const char * argv[])
{

    int a=-3;
    int b=2;
    printf("a=%d, b=%d, a/b=%d\n",a,b,a/b);
    a=3;
    printf("a=%d, b=%d, a/b=%d\n",a,b,a/b);
    return 0;
}

Drucke:

a=-3, b=2, a/b=-1
a=3, b=2, a/b=1
5
dawg

Meine eigene Lieblingslösung ist diese, was es wert ist. Nur ganzzahlige Arithmetik, eine einzige Division und alles andere lineare Zeit:

def integer_divide_towards_zero(a, b):
    return -(-a // b) if a < 0 else a // b

Das setzt voraus, dass b positiv ist, aber in den meisten Anwendungen, die ich gesehen habe, stimmt das. Wenn Sie auch mit negativer b umgehen müssen, wird die Funktion geringfügig komplizierter:

def integer_divide_towards_zero(a, b):
    return -(-a // b) if (a < 0) ^ (b < 0) else a // b

Einige Beispielausgaben:

>>> integer_divide_towards_zero(11, 3)
3
>>> integer_divide_towards_zero(-11, 3)
-3
>>> integer_divide_towards_zero(6, 3)
2
>>> integer_divide_towards_zero(-6, 3)
-2
>>> integer_divide_towards_zero(11, -3)
-3
>>> integer_divide_towards_zero(-11, -3)
3
4
Mark Dickinson

Versuche dies. Funktioniert nur für Zahlen größer als -1

import math

x = .5
y = -.5

print math.floor(math.fabs(x))
>> 0

print math.floor(math.fabs(y))
>> 0
1
Conor Patrick

Mein Hut mit ein paar alternativen Ideen werfen:

Multiplizieren Sie das Vorzeichen der Zahl [abs (x)/x] mit abs (x)/2

(abs(x)/x)*(abs(x)/2)

Führen Sie die Addition durch, aber wenn die Zahl kleiner als Null ist, fügen Sie Eins hinzu, um sie näher an 0 zu verschieben.

x/2 + int(x<0)
1
user764357

Der richtige Code dafür ist meiner Meinung nach zu unübersichtlich, um als 1-Liner zu schreiben. Also würde ich es in eine Funktion setzen, wie:

def int0div(a, b):
    q = a // b
    if q < 0 and b*q != a:
        q += 1
    return q

Gute Eigenschaften: Es funktioniert für jede Größe von int, nimmt keine Anpassung an das rohe (a//b) -Ergebnis vor, es sei denn, es ist nur eine Division erforderlich (% führt auch eine Division unter den Deckblättern durch), und erstellt keine größeren Ganzzahlen als die Eingänge. Diese können in Ihrem Antrag von Belang sein oder nicht; Sie werden wichtiger (für die Geschwindigkeit), wenn Sie "große" Ganzzahlen verwenden.

1
Tim Peters

warum das Rad neu erfinden, wenn es eine perfekte math.trunc () -Funktion gibt?

import math
print(math.trunc(-3.5))
>>-3
print(math.trunc(3.5))
>>3
0
jjisnow

Sie können das Modul Decimal auch als Teil der Standard-Python-Bibliotheken verwenden.

Insbesondere gilt: "Der Ganzzahl-Divisionsoperator // verhält sich analog und gibt den ganzzahligen Teil des wahren Quotienten (der gegen Null abschneidet) anstelle seines Stockwerks zurück, um die gewöhnliche Identität x == (x // y) beizubehalten ) * y + x% y: "

>>> -7 // 4
-2
>>> Decimal(-7) // Decimal(4)
Decimal('-1')

Werfen Sie einen Blick auf Rundungsmodi Sie haben viele Möglichkeiten, Ihre Informationen anzuzeigen/abzurunden - Decke, Boden, Boden, Halbtief, Halbtief, Halbtief, Hoch und Rundrundung . 

Decimal wurde als Lösung für das traditionelle Problem der binären Mathematik in einer Welt geschrieben, in der Dezimallösungen erwartet werden

0
jjisnow