2016-11-23 6 views
0

Wählen Sie Abfrage, die zusätzliche Nachkommastellen enthält. Der Datentyp der Spalte ist dezimal (4,2). Der gespeicherte Wert ist 1.39, aber was ich bekomme ist 1.3899999999999999.Zusätzliche Nachkommastellen

Ich kann Runde, number_format in PHP durchführen aber gibt es eine Möglichkeit, den genauen Wert ohne zusätzliche Ziffern nach dem Komma zu bekommen ??

Datenbank ist MSSQL.

+0

Zielvariablendatentyp? – jarlh

+0

Ich verwende PHP5.6 ... also kein expliziter Datentyp ist angegeben .. –

+0

SELECT ROUND (1.3899999999999999, 2) – Chanukya

Antwort

1

Höchstwahrscheinlich konvertiert Ihre Datenbankbibliothek den DECIMAL(4, 2) Datentyp hinter die Kulissen zu einem float. Jetzt 1.39 kann nicht genau als eine Gleitkommazahl ausgedrückt werden, stattdessen wird es an 1.3899999999999999023003738329862244427204132080078125 approximiert (verwenden Sie eine online converter oder eine <?php ini_set("precision", 99); var_dump(1.39);).

Es gibt einige Workarounds, die einfachste ist die Dezimalzahl auf Zeichenfolge auf Abfrageebene zu konvertieren:

SELECT CAST(col AS VARCHAR(4)) AS col_as_string FROM ... 

Die andere Lösung ist es, die number_format Funktion zu verwenden, die die Werte zu runden scheint.

0

Ich vermute 1,39 kann nicht genau als ein Schwimmer dargestellt werden.

Ich weiß nicht, PHP, hier so einige Java-Code zu demonstrieren:

class DoubleFloat { 
    public static void main(String[] args) { 
    float f = 1.39f; 
    double d = 1.39f; 
    System.out.println("f = " + f); 
    System.out.println("d = " + d); 
    } 
} 

Der Ausgang:

f = 1.39 
d = 1.3899999856948853 

abhängig, was Sie auf der PHP-Seite zu tun versuchen, aber Sie könnten die Zahl als ganze Zahl speichern, z 1.39 wird als 139 gespeichert und konvertiert irgendwie auf der PHP-Seite.

1

Beachten Sie, dass PHP für Zahlen mit Dezimalstellen keinen genauen Datentyp hat. Beim Arbeiten mit solchen Zahlen wird immer ein approximierter Datentyp (Fließkommazahlen) verwendet.

Der Vergleich von 0,1 + 0,2 mit 0,3 zum Beispiel kann sehr wahrscheinlich zu false führen. Das bedeutet: Sei vorsichtig mit Gleichheitsvergleiche.

Wenn Sie solche Werte anzeigen, sollten Sie sich nie auf die Standardpräsentation verlassen, sondern stattdessen number_format verwenden. Z.B. number_format($value, 2).

Wenn Sie Fließkomma-Probleme vollständig vermeiden möchten, verwenden Sie keine Zahlen mit Dezimalstellen. Das kann jedoch ein Aufwand sein (z. B. das Abrufen der Ganzzahl 139 für 1,39 und das Beachten, dass dieser Wert Hundertstel bedeutet).

Verwandte Themen