2013-11-09 6 views
6

Ich bekomme eine Nummer aus der Datenbank und diese Nummer könnte entweder float oder int sein.

Ich brauche die Dezimalgenauigkeit der Anzahl an 3 zu setzen, die die Zahl nicht mehr als (in Bezug auf Nachkommastellen) 5.020 oder 1518845.756 machen.Setzen Sie die Genauigkeit für eine Float-Nummer in PHP

PHP

round($number, $precision) 

Ich sehe ein Problem:

Es rundet die Zahl. Ich brauche eine Funktion, um nur die Dezimalstellen kurz zu schneiden, ohne ihre Werte zu ändern, die round() scheint nicht zu folgen.

Antwort

12

können Sie number_format() verwenden, um dies zu erreichen:

echo number_format((float) $number, $precision, '.', ''); 

Diese 1518845.756789 zu 1518845.757 umwandeln würde.

Aber wenn Sie wollen einfach nur kurz, um die Anzahl der Dezimalstellen abgeschnitten 3 und nicht Runde, dann können Sie wie folgt vorgehen:

$number = intval($number * ($p = pow(10, $precision)))/$p; 

Es sieht vielleicht auf den ersten einschüchternd, aber das Konzept ist wirklich einfach. Sie haben eine Zahl, multiplizieren Sie es mit 10 (es wird 1518845756.789), um es in eine ganze Zahl so alles nach den 3 Dezimalstellen wird entfernt (wird 1518845756), und dann teilen Sie das Ergebnis durch 10 (wird 1518845.756).

Demo

+1

dies nicht, wenn 'intval ($ Nummer * ($ p ...))' nicht als ganze Zahl dargestellt werden arbeiten. Zum Beispiel: '$ number = 10000000; $ precision = 3; 'results in' 1410065.408' auf einer 32-Bit-Maschine. –

+0

@ NisseEngström Ich weiß nicht, was machst du, da du mit einer ganzen Zahl beginnst und mit Unsinn endet ... – arod

+2

@arod: Das ist * mein * Punkt. Wenn * number * × * multiplier * zu groß ist, um als Ganzzahl dargestellt zu werden, endet der Unsinn.Auf einer 64-Bit-Maschine benötigen Sie größere Zahlen und Präzision, um mit unsinnigen Werten zu enden. –

6

Sein Klang wie floor mit Dezimalstellen. So können Sie so etwas wie

floor($number*1000)/1000 
+0

wahrscheinlich der schnellste? – Hafenkranich

2

versuchen Wenn ich richtig verstehe, würden Sie nicht Rundung erfolgen soll und Sie würden die Präzision 3.

So ist die Idee sein wollen ist number_format() für eine Präzision zu verwenden, von 4 und dann die letzte Ziffer entfernen:

$number = '1518845.756789'; 
$precision = 3; 

echo substr(number_format($number, $precision+1, '.', ''), 0, -1); 

Will Anzeige:

1518845.756 

statt:

1518845.757 

Links: number_format(), substr()

+0

Dies funktioniert nicht, wenn die 4. Dezimalstelle eine "9" ist und die 5. Dezimalstelle eine Überschreitung bewirkt. Versuchen Sie es zum Beispiel mit '$ number = '0.00096''. –