E gekürzte Zero floats in dezimal umwandeln float(8.17E-6)

LukaszRT

Grünschnabel
Hi

Bin gerade leider am verzweifeln. Wohl vermutlich auch weil ich nicht weis wie man diesen Zahlenformat nennt. Also folgendes. Meine API Abfrage liefert folgende floats, die Zeros gekürzt hat. (Taschenrechnerformat). Es handelt sich hierbei um eine Kursabfrage an der Börse. Nun bekomme ich folgende floats:

Code:
//float(8.18E-6) float(8.19E-6) float(8.17E-6) float(8.16E-6) float(8.15E-6)

for schleife
....
var_dump(round($data->result[$i]->Limit,10));
.....
//float(8.18E-6) float(8.19E-6) float(8.17E-6) float(8.16E-6) float(8.15E-6)

Ich habe nun alles probiert das in eine gültige Dezimalzahl umzuwandeln. Mit Numberformat, mit round mit *1 und sonst was. Jedes Mal ohne Erfolg. Wer kann mir hier sagen wie ich das nun in Dezimal umwandel.
 
Der Variablentyp heißt "float" (gängigerweise 32 Bit) oder auch "double" (64 Bit), die interne Bitrepräsentation ist nach IEEE 754 genormt.

Ich habe nun alles probiert das in eine gültige Dezimalzahl umzuwandeln.
Wie definierst du "gültige Dezimalzahl"? Was ist für dich eine akzeptable String-Repräsentation eines float-Werts? Das Problem, ein float in einen String zu wandeln, ist nicht so trivial, wie man denken mag. Spaßeshalber kannst du dazu mal [1] öffnen und durchscrollen ;)
Zum Beispiel werden "0.21" und "0.21000000000000002" (aus [1]) auf denselben float-Wert abgebildet. Aber welchen von beiden soll eine Funktion floatToString($floatVal) denn nun ausgeben?

Meines Erachtens sollte man in 99% der Anwendungsfälle nie Floats einfach zu String implizit konvertieren, wenn man sie dem Endnutzer anzeigen möchte. Stattdessen sollte man immer die Anzahl der Nachkommastellen explizit angeben. In PHP funktioniert folgender Code für mich super:

PHP:
$a = 8.18E-6;
echo number_format($a, 5, '.', '');

Welche genauen Probleme hattest du mit number_format?

---

[1]: Andrysco, Marc, Ranjit Jhala, and Sorin Lerner. "Printing floating-point numbers: a faster, always correct method." ACM SIGPLAN Notices 51, no. 1 (2016): 555-567.
PDF: https://cseweb.ucsd.edu/~lerner/papers/fp-printing-popl16.pdf.
 
Zurück