Aktueller Standort: Startseite> Neueste Artikel> So vermeiden Sie Schwimmpunkte -Präzisionsprobleme bei Verwendung von Binec ()

So vermeiden Sie Schwimmpunkte -Präzisionsprobleme bei Verwendung von Binec ()

M66 2025-06-02

In PHP wird die BindEc () -Funktion verwendet, um binäre Zeichenfolgen in Dezimalzahlen umzuwandeln. Die grundlegende Nutzung ist sehr einfach:

 <?php
$binary = "1101";
$decimal = bindec($binary);
echo $decimal; // Ausgabe 13
?>

Wenn jedoch binäre Zeichenfolgen sehr lang sind, insbesondere wenn sie den Bereich, den PHP genau darstellen kann, überschreiten, kann BindEC () aufgrund von Präzisionsbeschränkungen für Gleitpunkte zu Fehlern führen. Dies liegt daran, dass BindEc () einen Wert eines schwebenden Punktzahltyps zurückgibt, während PHP eine begrenzte Genauigkeit der schwebenden Punktzahl aufweist und die längste Anzahl von Ganzzahl -Ziffern, die genau dargestellt werden können, etwa 15 Ziffern beträgt.

Warum gibt es Genauigkeitsprobleme?

PHP -Schwimmpunktzahlen basieren auf dem IEEE 754 Double Precision Standard, und deren Genauigkeitsgrenze bedeutet, dass das Konvertierungsergebnis abgerundet wird, was zu ungenauen Werten führt. Zum Beispiel:

 <?php
$longBinary = "111111111111111111111111111111111111"; // 35Bit binär
echo bindec($longBinary); // Die Ergebnisse können ungenau sein
?>

In diesem Fall führt das von Binec () zurückgegebene Ergebnis zu Fehlern aufgrund von Einschränkungen der schwimmenden Punktgenauigkeit.

Wie vermeiden Sie Genauigkeitsfehler?

Lösung 1: Verwenden Sie BCMath, um die manuelle Konvertierung zu erweitern

Die BCMATH -Erweiterung von PHP unterstützt beliebige numerische Operationen, mit denen Binär bis Dezimalheit manuell implementiert werden kann, um den Verlust der Genauigkeit der schwimmenden Punkte zu vermeiden:

 <?php
function bindec_bcmath(string $binary): string {
    $decimal = '0';
    $len = strlen($binary);
    for ($i = 0; $i < $len; $i++) {
        $decimal = bcmul($decimal, '2');
        if ($binary[$i] === '1') {
            $decimal = bcadd($decimal, '1');
        }
    }
    return $decimal;
}

$longBinary = "111111111111111111111111111111111111";
echo bindec_bcmath($longBinary); // Präzise Konvertierung
?>

Lösung 2: Verwenden Sie die GMP -Erweiterung

Die GMP-Erweiterung (GNU Multi-Prescision) unterstützt außerdem große Operationen und bietet Methoden zum direkten Konvertieren aus binären Zeichenfolgen:

 <?php
$longBinary = "111111111111111111111111111111111111";
$decimal = gmp_strval(gmp_init($longBinary, 2), 10);
echo $decimal;
?>

Diese Methode ist einfach und effizient, geeignet, um große Zahlen zu behandeln.

Lösung 3: Custom Segmentation Conversion (nicht empfohlen)

Es kann auch durchgeführt werden, binäre Zeichenfolgen in Dezimalzimalpunkte durch Segmentierung umzuwandeln, aber die Implementierung ist komplexer und ineffizienter. BCMATH oder GMP wird empfohlen.

Zusammenfassen

  • Binec () eignet sich zur Umwandlung kurzer binärer Zeichenfolgen, wobei die Genauigkeitsgrenze der schwimmenden Punkte zu Fehlern führt.

  • Die Verwendung von BCMATH- oder GMP -Erweiterungen kann einen Genauigkeitsverlust vermeiden und große Zahlen korrekt umwandeln.