2017-07-06 2 views
1

Die Symfony\Component\HttpFoundation\JsonResponse scheint eine seltsame Reaktion zu haben.Symfony JsonResponse: falsch Float Präzision

Ich bekomme einen Doctrine "Dezimal" -Parameter aus meiner Objektliste und ich versuche, ein Array von ihnen mit einem zu senden. Aber der Dezimalwert ist nicht das, was ich erwartet, die „Präzision“ wirklich seltsam ist, und ich bin nicht in der Lage es abzurunden:

Meine Entity:

... 

/** 
* @var float Local average Grade 
* @ORM\Column(type="decimal", nullable=true, precision=4, scale=2) 
*/ 
private $grade; 

... 

Für dieses Beispiel verwende ich nur ein einziges Ergebnis meiner Daten. Wenn ich es aus der Datenbank zu lesen, kann ich lesen, wie erwartet: 8.30

Hier die Tests die ich gemacht habe:

var_dump(gettype($local->getGrade())); 
var_dump($local->getGrade()); 
var_dump((float) $local->getGrade()); 
var_dump(round($local->getGrade(), 2)); 


return new JsonResponse([ 
    'grade' => $local->getGrade(), 
    'roundedGrade' => round($local->getGrade(), 2) 
]); 

Und hier ist das Ergebnis:

string(6) "string" 
string(4) "8.10" 
float(8.1) 
float(8.1) 

{ 
    "grade":8.0999999999999996447286321199499070644378662109375, 
    "roundedGrade":8.0999999999999996447286321199499070644378662109375 
} 

Es ergibt keinen Sinn für mich. Hat jemand eine Vorstellung davon, was hier passiert?

Vielen Dank.

+1

https://www.leaseweb.com/labs/2013/06/the-php-floating-point-precision-is-wrong-by-default/ – Doug

+0

Dies könnte dich auch interessieren, da du auf das gute alte "Float-Problem beim Programmieren" gestoßen bist: https://stackoverflow.com/questions/1642614/how-to-ceil-floor-and-round-bcmath-numbers (und du wirst Ich möchte das bcmath-Paket nutzen, denn wir alle lieben unsere Dezimalzahlen, um zu lesen, was wir von ihnen erwarten. ^^) –

Antwort

1

Try this:

echo number_format((float)$local->getGrade(), 2, '.', ''); //8.10 
+0

Das gibt eine Zeichenkette zurück, keine Fließkommazahl, aber ich kann damit arbeiten. Vielen Dank. (Auch wenn ich nicht verstehe, was hier anders passiert) –