Zeigen Sie eine Zahl mit zwei Dezimalstellen an

571

Was ist der richtige Weg, um eine PHP-Zeichenfolge auf zwei Dezimalstellen zu runden?

$number = "520"; // It's a string from a database

$formatted_number = round_to_2dp($number);

echo $formatted_number;

Die Ausgabe sollte sein 520.00;

Wie soll die round_to_2dp()Funktionsdefinition sein?

Rich Bradshaw
quelle
13
Das ist wirklich keine "Rundung". Rundung reduziert die Präzision. Es werden keine Dezimalstellen zu einer Zahl hinzugefügt, die diese nicht hat. Basierend auf vielen Antworten und Kommentaren scheinen die Leute zu denken, dass Rundung etwas ist, was es nicht ist. roundist eine mathematische Funktion, und dies ist nur ein Formatierungsproblem.
Keine Panik

Antworten:

1131

Sie können number_format () verwenden :

return number_format((float)$number, 2, '.', '');

Beispiel:

$foo = "105";
echo number_format((float)$foo, 2, '.', '');  // Outputs -> 105.00

Diese Funktion gibt eine Zeichenfolge zurück .

Codemwnci
quelle
4
round () wäre besser für seine Lesbarkeit und Einfachheit, aber für alles Kritische beachten Sie, dass es bekanntermaßen
fehlerhaft ist
40
@ ÁlvaroG.Vicario roundlöst das Problem des OP hier nicht. round("520", 2)Gibt den Gleitkommawert zurück 520, und ein Echo, das ihn natürlich nicht auf 2 Dezimalstellen anzeigt. Für den Zweck des OP - eine Ganzzahl mit 2 Dezimalstellen durch Auffüllen mit nachgestellten Nullen anzuzeigen - benötigen Sie eine Zahlenformatierungsfunktion, keine Rundungsfunktion.
Mark Amery
3
Alle anderen Antworten sind auf Dezimalwerte mit Punktnotation beschränkt. Wenn Sie 520,00stattdessen bekommen müssen 520.00, funktioniert dies einfach.
SPRBRN
1
Wenn Sie nur float, aber nicht int begrenzen möchten, dann bcdiv ($ number, 1,2)
Wasim A.
2
Ich denke, Sie sollten bcadd (0, $ yournumber, 2) verwenden, um ein perfektes Ergebnis zu erzielen.
Jewelhuq
213

Verwenden Sie round()(verwenden Sie, wenn Sie eine Zahl nur im Float-Format erwarten, andernfalls verwenden Sie number_format () als Antwort von Codemwnci ):

echo round(520.34345, 2);   // 520.34
echo round(520.3, 2);       // 520.3
echo round(520, 2);         // 520

Aus dem Handbuch:

Beschreibung:

float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]);

Gibt den gerundeten Wert von valauf angegeben zurück precision(Anzahl der Nachkommastellen). precisionkann auch negativ oder null sein (Standard).

...

Beispiel # 1 round()Beispiele

<?php
    echo round(3.4);         // 3
    echo round(3.5);         // 4
    echo round(3.6);         // 4
    echo round(3.6, 0);      // 4
    echo round(1.95583, 2);  // 1.96
    echo round(1241757, -3); // 1242000
    echo round(5.045, 2);    // 5.05
    echo round(5.055, 2);    // 5.06
?>

Beispiel # 2 Modusbeispiele

<?php
    echo round(9.5, 0, PHP_ROUND_HALF_UP);   // 10
    echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
    echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
    echo round(9.5, 0, PHP_ROUND_HALF_ODD);  // 9

    echo round(8.5, 0, PHP_ROUND_HALF_UP);   // 9
    echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
    echo round(8.5, 0, PHP_ROUND_HALF_ODD);  // 9
?>
Somnath Muluk
quelle
5
@ Khuderm round($number, 2);funktioniert nicht. Ich möchte 520.00 nicht 520. Ich kann nicht glauben, dass round das nicht standardmäßig macht.
Claudiu Creanga
2
Es beantwortet das OP nicht einmal richtig, hat aber über 100 Stimmen!
Rob Sedgwick
200

Alternative,

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
Marc B.
quelle
3
Was ist, wenn du willst 520,00? Ich denke, die andere Antwort funktioniert in diesem Fall besser.
SPRBRN
2
^ nein, die andere Antwort gibt nicht zwei Dezimalstellen für einen int
pythonian29033
1
andere Gründe, die Sie vielleicht wollen, sind, dass Sie keine Rundung wollen ... oder in meiner Sache werden zurückgegebene SQL-Floats nicht wie normale Floats behandelt, was ein PHP-Mathematikfehler ist
Amb3rL4nn
34

http://php.net/manual/en/function.round.php

z.B

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06
SystemX17
quelle
Round wird genau die Funktionalität ausführen, die Rich wünscht, aber number_format () wäre interessanter, um alle Arten der numerischen Formatierung zu untersuchen.
Shamim Hafiz
Diese Methode führt auch eine Rundung durch, indem nur die Ziffern ".00" am Ende erzwungen werden.
SystemX17
10
Ich hatte es versucht, aber es funktioniert nicht - es wird nicht die zusätzlichen 0,00 hinzufügen.
Rich Bradshaw
Versuchen Sie es mit einem der Beispiele, die ich dort habe. Es ist für sich allein in einem PHP-Skript. Sie sollten das kommentierte Ergebnis erhalten. Wenn nicht, haben Sie irgendwo ein Problem mit Ihrem PHP-Setup.
SystemX17
1
Runde (520, 2) gibt 520 zurück, nicht 520.00, wie von @Rich gefordert
user761100
25

Versuchen:

$number = 1234545454; 
echo  $english_format_number = number_format($number, 2); 

Die Ausgabe wird sein:

1,234,545,454.00
Biju
quelle
2
Das funktioniert, aber die Ausgabe wäre eine Zeichenfolge und keine Zahl.
Ethan
1
Wenn Sie number_format verwenden möchten, machen Sie es mindestens number_format ($ number, 2, '.', '')
Mihai P.
14

Sie können das PHP printfoder die sprintfFunktionen verwenden:

Beispiel mit sprintf:

$num = 2.12;
echo sprintf("%.3f", $num);

Sie können das gleiche auch ohne ausführen echo. Beispiel:sprintf("%.3f", $num);

Ausgabe:

2.120

Alternativ mit printf:

echo printf("%.2f", $num);

Ausgabe:

2.124
Aditya P Bhatt
quelle
12

Eine andere exotischere Möglichkeit, dieses Problem zu lösen, besteht darin, bcadd()einen Dummy-Wert für den $ right_operand von zu verwenden 0.

$formatted_number = bcadd($number, 0, 2);
powtac
quelle
2
Beachten Sie, dass bc*Funktionen nicht aufgerundet werden, sondern immer abgerundet werden. Beispielsweise bcadd("1.0999","0.0",1)ergibt sich "1,0", nicht "1,1".
ColinM
1
BC Math-Funktionen stoppen die Verarbeitung nur bei $scaleBruchstellen. Dies entspricht einer Rundung gegen Null.
Ali
11

Verwenden Sie die Funktion PHP number_format () .

Zum Beispiel,

$num = 7234545423;
echo number_format($num, 2);

Die Ausgabe wird sein:

7,234,545,423.00
Sani Kamal
quelle
7

round_to_2dp ist eine benutzerdefinierte Funktion, und nichts kann getan werden, wenn Sie die Deklaration dieser Funktion veröffentlicht haben.

Meine Vermutung lautet jedoch: number_format($number, 2);

ajreal
quelle
14
Ich glaube, Sie haben die Frage von Ihrem ersten Absatz an falsch verstanden. round_to_2dp($number);war als Pseudocode gemeint; Das OP bat jemanden, ihm zu sagen, durch was dieser Ausdruck ersetzt werden sollte.
Mark Amery
7
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point

Dies zeigt genau zwei Stellen nach dem Dezimalpunkt an.

Vorteil:

Wenn Sie zwei Ziffern nur nach einem Gleitkommawert und nicht nach int anzeigen möchten, verwenden Sie diese Option.

Wasim A.
quelle
Dies ist die universellste Lösung, wenn Sie über bcdiv verfügen (es handelt sich um ein Standardpaket auf Centos6, das jedoch nicht dem Standard entspricht).
Shovas
6
$twoDecNum = sprintf('%0.2f', round($number, 2));

Die Rundung rundet die Zahl korrekt und der Sprint erzwingt sie auf 2 Dezimalstellen, wenn sie nach der Rundung zufällig nur 1 Dezimalstelle beträgt.

JohnS
quelle
6
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', ''); 

Es wird 5,98 zurückgegeben, ohne die Zahl zu runden.

mrphpguru
quelle
Nur so kann der Job dann auch floor($retailPrice * 100) / 100;kein Zahlenformat mehr benötigen.
Somsgod
6

Zur bedingten Abrundung dh. Zeige Dezimalstelle, wo es wirklich benötigt wird, sonst ganze Zahl

123,56 => 12,56

123,00 => 123

$somenumber = 123.56;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123.56


$somenumber = 123.00;

$somenumber = round($somenumber,2);

if($somenumber == intval($somenumber))
{
    $somenumber = intval($somenumber);
}

echo $somenumber; // 123    
Weinstock
quelle
6

Ich mache meine eigenen.

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
joanlgr
quelle
1
Es ist schön zu sehen, welche Mathematik dazu benötigt wird. Obwohl die Verwendung einer eingebauten Funktion für mich bevorzugt wird. Es macht keinen Sinn, das Rad neu zu erfinden.
Glühbirne1
1
Sorry, aber round (), wie es heißt, round de number, und manchmal möchte ich nicht runden.
Joanlgr
5

Hier bekomme ich zwei Dezimalstellen nach dem .(Punkt) mit einer Funktion ...

function truncate_number($number, $precision = 2) {

    // Zero causes issues, and no need to truncate
    if (0 == (int)$number) {
        return $number;
    }

    // Are we negative?
    $negative = $number / abs($number);

    // Cast the number to a positive to solve rounding
    $number = abs($number);

    // Calculate precision number for dividing / multiplying
    $precision = pow(10, $precision);

    // Run the math, re-applying the negative value to ensure
    // returns correctly negative / positive
    return floor( $number * $precision ) / $precision * $negative;
}

Ergebnisse der obigen Funktion:

echo truncate_number(2.56789, 1); // 2.5
echo truncate_number(2.56789);    // 2.56
echo truncate_number(2.56789, 3); // 2.567

echo truncate_number(-2.56789, 1); // -2.5
echo truncate_number(-2.56789);    // -2.56
echo truncate_number(-2.56789, 3); // -2.567

Neue richtige Antwort

Verwenden Sie die native PHP-Funktion bcdiv

echo bcdiv(2.56789, 1, 1);  // 2.5
echo bcdiv(2.56789, 1, 2);  // 2.56
echo bcdiv(2.56789, 1, 3);  // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 2); // -2.56
echo bcdiv(-2.56789, 1, 3); // -2.567
Herr HK
quelle
4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

Dies gibt Ihnen 2 Zahlen nach der Dezimalstelle.

S'copion Sam
quelle
4
Nein, wird es nicht. Ich weiß nicht, wann dieser Beitrag geschrieben wurde, aber wenn Sie ihn mit Ihrem eigenen Beispiel versuchen, zumindest auf meinem Computer :-), wird er 520,90 ausgeben. Das heißt, es wird eine Rundung auftreten. Achtung!
Boaz Rymland
4

Wenn Sie in Ihrem gesamten Projekt zwei Dezimalstellen verwenden möchten, können Sie Folgendes definieren:

bcscale(2);

Dann erzeugt die folgende Funktion das gewünschte Ergebnis:

$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11

Wenn Sie die Funktion bcscale jedoch nicht verwenden, müssen Sie den Code wie folgt schreiben, um das gewünschte Ergebnis zu erzielen.

$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11

Mehr wissen

Jewelhuq
quelle
2

Nummer ohne Runde

$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);
Abhishek Sharma
quelle
1

Hier ist eine andere Lösung mit strtok und str_pad :

$num = 520.00
strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')
Bryan
quelle
0

Hinzufügen zu anderen Antworten, da number_format () standardmäßig ein Tausendertrennzeichen hinzufügt.

Um dies zu entfernen, gehen Sie folgendermaßen vor:

$number = number_format($number, 2, ".", "");
Ivan Ivković
quelle
0
  • Wählen Sie die Anzahl der Dezimalstellen
  • Kommas formatieren (,)
  • Eine Option zum Trimmen von nachgestellten Nullen

Ein für alle Mal!

function format_number($number,$dec=0,$trim=false){
  if($trim){
    $parts = explode(".",(round($number,$dec) * 1));
    $dec = isset($parts[1]) ? strlen($parts[1]) : 0;
  }
  $formatted = number_format($number,$dec); 
  return $formatted;
}

Beispiele

echo format_number(1234.5,2,true); //returns 1,234.5
echo format_number(1234.5,2);      //returns 1,234.50
echo format_number(1234.5);        //returns 1,235
Kareem
quelle
-5

Sie können die PHP- Funktion round () verwenden.

echo round(3.4);         // 3
echo round(3.5);         // 4
echo round(3.6);         // 4
echo round(3.6, 0);      // 4
echo round(1.95583, 2);  // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2);    // 5.05
echo round(5.055, 2);    // 5.06
Sadikhasan
quelle
3
-1; Diese Antwort fügt nichts Neues hinzu, das Somnath Muluks Antwort noch nicht 2 Jahre zuvor enthielt.
Mark Amery
1
Es ist auch falsch, wie in meinem Kommentar zu Somnaths Antwort erwähnt.
Mark Amery