Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man Float-Werte ohne Rundung präzise kürzen?

Wie kann man Float-Werte ohne Rundung präzise kürzen?

DDD
DDDOriginal
2024-11-05 19:47:02746Durchsuche

How to Precisely Truncate Float Values Without Rounding?

Wie erhalte ich präzise abgeschnittene Gleitkommawerte?

Das Abschneiden von Gleitkommawerten oder das Entfernen von Ziffern über eine bestimmte Anzahl von Dezimalstellen hinaus ist ein häufiger Vorgang in der Programmierung. Aufgrund der Einschränkungen der Gleitkommadarstellung kann es jedoch eine Herausforderung sein, eine genaue Kürzung ohne Rundung zu erreichen.

Das Problem verstehen

Betrachten Sie das Beispiel:

1.923328437452 -> 1.923

Ein Naiv Der Ansatz bestünde darin, den Gleitkommawert in einen String umzuwandeln und ihn abzuschneiden. Dies kann jedoch aufgrund der ungenauen Natur von Gleitkommadarstellungen zu Fehlern führen. Unterschiedliche Gleitkommawerte können dieselbe binäre Darstellung haben, was zu mehrdeutiger Kürzung führt.

Die empfohlene Methode

Für Python-Versionen 2.7 und höher bietet die folgende Funktion eine genaue Kürzung ohne Rundung:

def truncate(f, n):
    '''Truncates/pads a float f to n decimal places without rounding'''
    s = '{}'.format(f)
    if 'e' in s or 'E' in s:
        return '{0:.{1}f}'.format(f, n)
    i, p, d = s.partition('.')
    return '.'.join([i, (d+'0'*n)[:n]])

Erklärung

Der Kern dieser Methode besteht darin, die Gleitkommazahl mithilfe von '{}'.format(f) in einen String umzuwandeln und den String auf die gewünschte Anzahl von Dezimalstellen zu kürzen. Für Werte in wissenschaftlicher Notation ('e' oder 'E') wird die Syntax '{0:.{1}f}'.format(f, n) verwendet, um die Genauigkeit anzugeben.

Handling Special Fälle

In seltenen Fällen können Gleitkommazahlen, die sehr nahe an runden Zahlen liegen, dennoch falsch abgeschnitten werden. Geben Sie in solchen Fällen eine höhere Genauigkeit an, um sicherzustellen, dass das Runden während der String-Konvertierung keinen Einfluss auf das Ergebnis hat.

Alternativen für ältere Python-Versionen

Für Python-Versionen unter 2.7 ist das Runden eine weniger genaue Methode die Gleitkommazahl auf 12 Dezimalstellen vor dem Abschneiden:

def truncate(f, n):
    '''Truncates/pads a float f to n decimal places without rounding'''
    s = '%.12f' % f
    i, p, d = s.partition('.')
    return '.'.join([i, (d+'0'*n)[:n]])

Schlussfolgerung

Dieser Code bietet eine robuste Lösung zum Abschneiden von Gleitkommawerten ohne Rundung und gewährleistet so eine genaue Kürzung für eine Vielzahl von Eingaben.

Das obige ist der detaillierte Inhalt vonWie kann man Float-Werte ohne Rundung präzise kürzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn