64-Bit-Fließkomma-Literale PHP

8

Ich versuche, einen 64-Bit-Float auf einen 64-Bit-Integer (und zurück) in PHP zu konvertieren. Ich muss die Bytes bewahren, also benutze ich die Funktionen packen und entpacken. Die Funktionalität ich suche ist im Grunde Java Double.doubleToLongBits () -Methode. Ссылка

ich es geschafft, diese mit etwas Hilfe für Pack aus den Kommentaren auf der PHP-docs weit zu kommen ():

%Vor%

Und das funktioniert gut, zum größten Teil ...

%Vor%
  

100000000

%Vor%
  

1.1710299640683E-305

Aber hier wird es knifflig ...

%Vor%
  

-6629571225977708544

Ich habe keine Ahnung, was hier nicht stimmt. Probieren Sie es selbst: Ссылка

Unter Linux benötigen Sie 64-Bit-PHP. Diese Seite scheint dieses Setup zu emulieren: Ссылка

    
kryo 01.06.2014, 17:33
quelle

3 Antworten

1

Es funktioniert ordnungsgemäß, das einzige Problem in diesem Fall ist in der Logik von:

%Vor%

Sie können die "gerundete" und "menschenlesbare" Ausgabe der Funktion echo nicht verwenden, um den ursprünglichen Wert zu dekodieren (weil Sie dann die Genauigkeit dieses Double verlieren).

Wenn Sie die Rückgabe von encode (10000000000000) in die Variable speichern und dann versuchen, wieder zu entschlüsseln , funktioniert sie ordnungsgemäß (Sie können echo verwenden auf 10000000000000 ohne Genauigkeit zu verlieren.

Bitte beachten Sie das Beispiel unten, das Sie auch auf Ссылка ausführen können:

%Vor%     
Jacek Sokolowski 03.06.2014, 19:58
quelle
4
%Vor%

Ссылка

  

... vertraue niemals   Floating-Nummer Ergebnisse auf die letzte Ziffer, und nicht Floating zu vergleichen   Punktnummern direkt für die Gleichheit. Wenn höhere Präzision notwendig ist,   Die mathematischen Funktionen und die gmp-Funktionen sind willkürlich   verfügbar. Eine "einfache" Erklärung finden Sie in der »Fließkomma-Anleitung   das trägt auch den Titel "Warum addieren sich meine Zahlen nicht?"

    
FuzzyTree 01.06.2014 18:16
quelle
0

Wenn Sie einen zuverlässigen festen Dezimalpunkt haben, wie in meinem Fall und im Fall der Währung, können Sie Ihren Float mit einer Potenz von 10 multiplizieren (zB 100 für Dollar).

%Vor%

Dies funktioniert jedoch nicht für große Zahlen und löst das Problem nicht offiziell. Es scheint, als wäre es unmöglich, von einem Integer in einen Float-String und zurück zu konvertieren, ohne den ursprünglichen Integer-Wert in PHP 5.4 zu verlieren.

    
kryo 06.06.2014 17:39
quelle