it-swarm.com.de

Gibt es einen Operator, der den Prozentsatz in Python berechnet?

Ich habe kürzlich erfahren, dass das "%" -Zeichen verwendet wird, um den Rest einer Ganzzahl in Python zu berechnen. Ich konnte jedoch nicht feststellen, ob es in Python einen anderen Operator oder eine andere Methode zur Prozentberechnung gibt.

Wie bei "/", bei dem Sie den Quotienten erhalten, erhalten Sie die Antwort, wenn Sie nur einen Gleitkommawert für eine der ganzen Zahlen verwenden, wie bei der traditionellen Division. Gibt es also eine Methode, um den Prozentsatz zu berechnen?

38
nim6us

Es gibt keinen solchen Operator in Python, aber es ist trivial, ihn selbst zu implementieren. In der Computerpraxis sind Prozentsätze nicht annähernd so nützlich wie ein Modulo, daher implementiert keine Sprache, die mir einfällt, eine solche.

25
Rafe Kettler

Sie können einfach Ihre zwei Zahlen teilen und mit 100 multiplizieren. Beachten Sie, dass dies einen Fehler auslöst, wenn "ganz" 0 ist, da die Frage, wie viel Prozent von 0 eine Zahl ist, keinen Sinn ergibt:

def percentage(part, whole):
  return 100 * float(part)/float(whole)

Oder wenn die Frage, die Sie beantworten wollten, "Was sind 5% von 20?" Und nicht "Was sind 5% von 20?" Lautete (eine andere Interpretation der Frage, inspiriert von Carl Smiths Antwort ) du würdest schreiben:

def percentage(percent, whole):
  return (percent * whole) / 100.0
117
Brian Campbell

Die Antwort von Brian (eine benutzerdefinierte Funktion) ist im Allgemeinen die richtige und einfachste.

Aber wenn Sie wirklich einen numerischen Typ mit einem (nicht standardmäßigen) '%'-Operator definieren wollten, wie es Tischrechner tun, so dass' X% Y 'X * Y/100.0 bedeutet, dann können Sie ab Python 2.6) den mod () operator neu definieren:

import numbers

class MyNumberClasswithPct(numbers.Real):
    def __mod__(self,other):
        """Override the builtin % to give X * Y / 100.0 """
        return (self * other)/ 100.0
    # Gotta define the other 21 numeric methods...
    def __mul__(self,other):
        return self * other # ... which should invoke other.__rmul__(self)
    #...

Dies kann gefährlich sein, wenn Sie den Operator '%' für eine Mischung aus MyNumberClasswithPct mit normalen Ganzzahlen oder Gleitkommazahlen verwenden.

Dieser Code ist auch mühsam, da Sie alle 21 anderen Methoden eines Integrals oder Real definieren müssen, um die folgenden lästigen und undurchsichtigen TypeError zu vermeiden, wenn Sie ihn instanziieren

("Can't instantiate abstract class MyNumberClasswithPct with abstract methods __abs__,  __add__, __div__, __eq__, __float__, __floordiv__, __le__, __lt__, __mul__,  __neg__, __pos__, __pow__, __radd__, __rdiv__, __rfloordiv__, __rmod__, __rmul__,  __rpow__, __rtruediv__, __truediv__, __trunc__")
3
smci

Ich denke, das Problem wurde gelöst ... Auf jeden Fall dachte ich an diese Lösung:

def percent(string="500*22%"):
    if "%" == string[-1] and "*" in string:
        getnum = string[:-1]
        ops = getnum.split("*")
        result = int(ops[0]) * int(ops[1]) / 100
        print("The {}% of {} is {}".format(ops[1], ops[0], result))
        return result
    else:
        print("The argument must be a string like '500*22%'")

percent("1200*30%")

[Ausgabe]:

Die 30% von 1200 sind 360,0

Eine Klasse benutzen

class Percent:
    def __init__(self, operation="500*22%"):
        self.operation = operation
        if "%" == self.operation[-1] and "*" in self.operation:
            getnum = self.operation[:-1]
            ops = getnum.split("*")
            base = int(ops[0])
            percentage = int(ops[1])
            self.result = base * percentage / 100
            self.description = "The {}% of {} is {}".format(*ops, self.result)
        else:
            print("The argument must be a string like '500*22%'")


x = Percent("1200*30%")
print(x.result)
print(x.description)

ausgabe

360,0

Die 1200% von 30 sind 360,0

1
Giovanni Python