Probleme mit der Darstellung von Zahlen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Hallo Leute,
ich belästige ja schon einige von euch mit meinem Rechentrainer-Django-Problem
(viewtopic.php?t=53873&sid=065340b702598 ... 6408ecda12)
jetzt geht es aber "nur" um die Möglichkeiten der Darstellungf und Auswertung von Zahlen in Python. Also:

1. Einfache Kopfrechenaufgaben für meinen Rechentrainer erzeuge ich mit Zufallszahlen. Mit diesem Code(ausschnitt) erzeuge ich entweder Int oder Float Zahlen:

Code: Alles auswählen

	typ=random.randint(1,3)
        if typ==1:
                zahl1=random.randint(5, 45)
                zahl2=random.randint(5, 45)
        else:
                rund1 = random.randint(0,2)
                zahl1 = random.randint(5, 225)
                zahl1=zahl1/10**rund1
                rund2 = random.randint(0,2)
                zahl2 = random.randint(5, 225)
                zahl2=zahl2/10**rund2
        return typ, zahl1, zahl2, zahl1+zahl2
mit (zahl1)+(zahl2) gebe ich die Aufgabe (auf einer HTML-Seite) aus. Da stört mich zunächst mal der Punkt. Kann ich die Anzeige so ändern, dass ein Komma angezeigt wird?

2. Wenn meine Zufallszahlen eine oder zwei Stellen hinter dem Komma haben, so werden diese auch so angezeigt, bei den Ganzzahlen wird immer eine Stelle (eine Null) hinter dem Komma angezeigt, wie bekomme ich das weg?

3. Für meine (noch zu erstellenden) Rundungsaufgabe habe ich ein noch größeres Problem. Bei einer Aufgabe wie z.B. "Runde 17,503 auf Zehntel" würde auch "17,500" als Lösung akzeptiert. Da fällt mir nur ein, die Aufgabe in einen Sting umzuwandeln und diesen mit einer Stringeingabe zu vergleichen. Auch bei diesen Aufgaben werden die Zahlen und die Rundungsstelle mit Zufallszahlen erstellt werden.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Ich bin unterwegs und kann daher keine Links bieten, aber was du suchst die "Lokalisierung" des Zahlenformates. Und das darf erst bei der Anzeige der Zahl passieren.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 8, mit Tabs mischen ist sogar ganz verboten. Um Zuweisungs- oder Vergleichsoperatoren werden Leerzeichen gesetzt,bei Dir ist die Leerzeichensetzung sehr inkonsistent.

Wenn man etwas mehrfach macht, dann kopiert man nicht Code, sondern schreibt sich eine Funktion, die mehrfach aufgerufen wird. Es ist seltsam, dass je mehr Nachkommastellen ich habe, desto kleiner wird die größte Zahl (was aber beim Rechenergebnis keine Rolle spielt, denn eine Zahl bis 225 mit 0 Nachkommastellen und eine Zahl bis 2.25 mit zwei Nachkommastellen gibt im Ergebnis auch eine große Zahl mit 2 Nachkommastellen).

Wenn Dir die String-Ausgabe nicht gefällt, dann mußt Du halt selbst eine schreiben.

Code: Alles auswählen

from random import random, randint

def random_number(max_number=225, max_digits=2):
    return round(random() * max_number, randint(0, max_digits))

def format_number(number):
    return f"{number}".replace('.', ',').rstrip('0').rstrip(',')

def random_sum():
    typ = randint(1, 3)
    if typ == 1:
        zahl1 = random_number(45, 0)
        zahl2 = random_number(45, 0)
    else:
        zahl1 = random_number(225, 2)
        zahl2 = random_number(225, 2)
    return typ, format_number(zahl1), format_number(zahl2), format_number(zahl1 + zahl2)
Wenn der erzwingen willst, dass eine Zahl mit einer exakten Anzahl an Nachkommastellen eingegeben werden soll, dann mußt Du wohl mit einem String vergleichen.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Vielen Dank soweit!
Das mit dem Einrücken ist erst beim Kopieren passiert.
Das mit den Leerstellen habe ich sofort geändert (Gut dass ich das jetzt weiß, jetzt konnte ich meinen gesamten Code noch recht schnell ändern).
Aber noch zwei Fragen von einem Newbe:

Code: Alles auswählen

return f"{number}".replace('.', ',').rstrip('0').rstrip(',')
erzeugt einen String (ohne Leerzeichen)?

Und dann bin ich nicht so sicher, ob dein Code und meiner gleiche Egebnisse erzeugt. Meiner erzeugt jeweils ein Integer zwischen 5 und 225 (ich habe ein bsschen rumprobiert, welche Zahlen meiner Meinung nach noch im Kopf gerechnet werden sollten), dann ein Integer zwischen 0 und 2 und dann teile die erste Zahl durch 10 hoch zweitemInteger. Dann entsteht z.B. 178, 17,8, oder 1,78 - und genauso mit der zweiten Zahl.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Pitwheazle hat geschrieben: Montag 2. Mai 2022, 16:39
Aber noch zwei Fragen von einem Newbe:

Code: Alles auswählen

return f"{number}".replace('.', ',').rstrip('0').rstrip(',')
erzeugt einen String (ohne Leerzeichen)?
Hast du mal geschaut, was 'replace' und 'rstrip' macht?

Was passiert wenn du mal

Code: Alles auswählen

print(f"{1.5885000}".replace('.', ',').rstrip('0').rstrip(','))


laufen läasst?

bzw:

Code: Alles auswählen

print(type(f"{1.5885000}".replace('.', ',').rstrip('0').rstrip(',')))
Grüße
Dennis

Edit: zu den f-Strings:
https://peps.python.org/pep-0498/
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

@Pitwheazle: Mein Bauchgfühl sagt mir, dass das hier zielführender für deinen Anwendungsfall ist.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Vielen Dank an alle! Ich denke ich werde beide Wege brauchen, localisation für Zahlen und replace für die Strings, die ich wahrscheinlich für meine Rundungsaufgaben brauchen werde. Das muss ich jetzt mal ausprobieren und melde mich dann wieder.
Antworten