[Python] Eine Geschichte, die in eine Rundungsfalle zu geraten schien

Einführung

Es war eine Geschichte, die ich in eine Falle tappen wollte, als ich in meinem Unternehmen eine Testberechnung mit Python implementierte.

Ich wollte nur abrunden ...

"Oh, ich werde dir sagen, was gerade passiert ist!"

** "Ich dachte, ich würde" 2.5 "auf" 3 "abrunden, aber bevor ich es wusste, war es" 2 "" **

"Nun, ich weiß nicht wovon du sprichst, aber ich wusste nicht was du tust ..."

"Wie hübsch mein Kopf war ... Wenn es ein Berechnungsfehler oder ein Missverständnis ist, ist es so eine chaotische Sache. Ich habe etwas gruseligeres geschmeckt ... "

Dies ist das Hauptthema der Farce

Wie ich bereits sagte, wollte ich in Python abrunden.

Das erste, was mir in den Sinn kommt ** runde Funktion ** ** Formatierungsfunktion **

"Nun, wenn du es hier und da benutzt, kannst du es dir leisten."

Der Gedanke war plötzlich erschüttert ...

>>> k=2.5
>>> round(k)
2

"e"

Zu dieser Zeit war mein Gehirn voller Misstrauen gegenüber der Rundung, die ich damals in der Schulpflicht hätte lernen sollen.

** "Wann hast du die Illusion bekommen, dass 2,5 durch Runden 3 sein würde?" **

Nein nein Nein Nein

Wenn Sie "2.5" abrunden, ist es "3".

Aber wieso?

Versuchen wir es mit der Formatierungsfunktion

>>> format(k, '.0f')
'2'

Wie. Bist du ein Guru?

Aber wieso?

Ich habe untersucht

Wenn ich nachschaue Diese Person untersuchte und schlug ebenfalls eine ** Lösung ** vor.  ↓  ↓  ↓ Hinweis, weil ich süchtig nach Rundung von Python3 war

In diesem Artikel wurde festgestellt, dass die Ursache ** auf die nächste gerade Zahl ** gerundet ** war.

Auf das nächste Gerade runden [Bearbeiten] Auf die nächste Gerade gerundet (RN) wird abgerundet, wenn der Bruch kleiner als 0,5 ist, aufgerundet, wenn der Bruch größer als 0,5 ist, abgerundet oder aufgerundet, wenn der Bruch genau 0,5 ist, je nachdem, welche Ergebnisse gerade sind. Roll to. Es ist in JIS Z 8401 als Regel A definiert und wird nach Regel B (Rundung) als "wünschenswert" angesehen. Rundung verursacht eine Verzerrung. Selbst wenn es einen endlichen Anteil von Daten mit einem Bruchteil von 0,5 gibt, gibt es keine Verzerrung, und selbst wenn eine große Anzahl hinzugefügt wird, akkumuliert sich der Rundungsfehler nicht auf eine bestimmte Seite vorgespannt (gerade +). Wenn die Daten Eigenschaften wie 0,5 aufweisen, aber ungerade +0,5 nicht angezeigt werden, wird weiterhin eine Verzerrung angezeigt. Siehe auch: Wikipedia-Bruch

Es scheint, dass 0,5 auf Python2 aufgerundet werden kann Python 3 ist so.

Mit anderen Worten Wenn Sie "2,5" einstellen, wird auf der geraden Seite "2" angezeigt.

Wenn Sie es also mit "3.5" machen, ist es "4".

>>> k=3.5
>>> round(k)
4

Wo ist die Nachfrage nach dieser Spezifikation ...

Lösung

@ Shiracamus schlug eine Lösung für den Artikel vor, den ich zuvor vorgestellt hatte.

def round(x):
    return (x*2+1)//2
def round(x,d=0): #Tun Sie dies, wenn Sie die Anzahl der Ziffern angeben
    p=10**d
    return (x*p*2+1)//2/p

Das hat es gelöst. @ sak_2 @ Shiracamus Vielen Dank.

Bitte seien Sie auch vorsichtig.

Recommended Posts

[Python] Eine Geschichte, die in eine Rundungsfalle zu geraten schien
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Python, das viele Excel zu einem Excel zusammenführt
[Python] So schreiben Sie eine Dokumentzeichenfolge, die PEP8 entspricht
Eine Geschichte, von der ich bei np.where süchtig war
[Python] Eine praktische Bibliothek, die Kanji in Hiragana konvertiert
Python-Programm, das ical-Daten in Text konvertiert
Eine Geschichte, die beim Versuch, die Python-Version mit GCE zu aktualisieren, hängen blieb
Ein Weg zum mittleren Python
Eine Funktion, die iterable in Python in N Teile unterteilt
Ein Python-Skript, das ein GTK-Bild (Clipboard) in einer Datei speichert.
Eine Geschichte darüber, wie man einen relativen Pfad in Python angibt.
So schreiben Sie eine Meta-Klasse, die sowohl Python2 als auch Python3 unterstützt
Eine Geschichte über den Versuch, private Variablen in Python zu implementieren.
Ein Python-Skript, das Oracle-Datenbankdaten in CSV konvertiert
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Wie man schlechten Code mit Python-Refactoring in normalen Code verwandelt, der kein schönes objektorientiertes Design ist
Eine Geschichte, die ich süchtig danach war, Lambda von AWS Lambda anzurufen.
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
Eine Geschichte, die Qiita unbedingt in einer Proxy-Umgebung sehen wollte
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
So machen Sie einen String in Python zu einem Array oder ein Array zu einem String
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Eine Geschichte, die Schwierigkeiten hatte, 3 Millionen ID-Daten in einer Schleife zu verarbeiten
Eine Geschichte über den Versuch, mehrere Python-Versionen auszuführen (Mac Edition)
Python-Spezialcodec, der zu wissen scheint, aber nicht weiß
Ein Skript, das 0, 1 an die erste Python-Primzahl zurückgibt
Eine Kurzanleitung zu PyFlink, die Apache Flink und Python kombiniert
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
5 Möglichkeiten zum Erstellen eines Python-Chatbots
[Python] Ich habe einen Dekorateur gemacht, der keinen Nutzen zu haben scheint.
[Python] Ein Programm, das die Anzahl der gepaarten Socken berechnet
Ein Hinweis, mit dem Sie die Python-Umgebung von Pineapple mit pyenv ändern können
Ein Python-Programm, das die Größe eines Videos ändert und es in ein Bild verwandelt
Verwendung von hmmlearn, einer Python-Bibliothek, die versteckte Markov-Modelle realisiert
Eine Geschichte, die unter einem Unterschied im Betriebssystem litt, als sie versuchte, ein Papier zu implementieren
[Python] Ein Programm, das Treppen mit # erstellt
[Python] Extrahiere △△ mit maximalem ○○ mit Pandas
Eine Geschichte über einen magischen Umbau, der Lubuntu in ein Chromebook bringt
[Python] Wie man eine Klasse iterierbar macht
[Python] So konvertieren Sie eine zweidimensionale Liste in eine eindimensionale Liste
Python Bit Arithmetic Super Einführung
Eine Geschichte, die auf eine Vergleichsberechnung stieß
Beispielskript zum Überfüllen von Signalen in Python
Ich möchte eine Python-Umgebung erstellen
[Python] So invertieren Sie eine Zeichenfolge
Wie bekomme ich Stacktrace in Python?
10 Python-Fehler, die Anfängern häufig sind
[Python] Erstellen Sie einen LineBot, der regelmäßig ausgeführt wird
Eine Geschichte über Python Pop und Append
Eine typisierte Welt, die mit Python beginnt
Die Geschichte der Verarbeitung A von Blackjack (Python)