Pokaż liczbę z dokładnością do dwóch miejsc po przecinku

570

Jak poprawnie zaokrąglić ciąg PHP do dwóch miejsc po przecinku?

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

$formatted_number = round_to_2dp($number);

echo $formatted_number;

Wynik powinien być 520.00;

Jaka powinna round_to_2dp()być definicja funkcji?

Rich Bradshaw
źródło
13
To naprawdę nie jest „zaokrąglanie”. Zaokrąglanie zmniejsza precyzję. Nie doda miejsc dziesiętnych do liczby, która ich nie ma. Na podstawie wielu odpowiedzi i komentarzy wydaje się, że ludzie myślą, że zaokrąglanie jest czymś, czym nie jest. roundjest funkcją matematyczną, a to tylko problem z formatowaniem.
Nie panikuj

Odpowiedzi:

1131

Możesz użyć number_format () :

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

Przykład:

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

Ta funkcja zwraca ciąg znaków .

Codemwnci
źródło
4
round () byłby również lepszy ze względu na czytelność i prostotę, ale dla
każdego
40
@ ÁlvaroG.Vicario roundnie rozwiązuje tutaj problemu OP. round("520", 2)zwraca 520liczbę zmiennoprzecinkową i echo, które oczywiście nie pokaże go z dokładnością do 2 miejsc po przecinku. Do celów PO - pokazując liczbę całkowitą z 2 miejscami po przecinku, wypełniając ją zerami końcowymi - potrzebujesz funkcji formatowania liczb, a nie funkcji zaokrąglania.
Mark Amery
3
Wszystkie pozostałe odpowiedzi są ograniczone do wartości dziesiętnych z notacją kropkową. Kiedy musisz dostać 520,00zamiast 520.00, to po prostu działa.
SPRBRN
1
jeśli chcesz ograniczyć tylko liczbę zmiennoprzecinkową, ale nie int, to bcdiv (liczba $, 1,2)
Wasim A.
2
Myślę, że powinieneś użyć bcadd (0, $ yournumber, 2), to da ci doskonały wynik.
jewelhuq
213

Użyj round()(użyj, jeśli oczekujesz tylko liczby w formacie zmiennoprzecinkowym, w przeciwnym razie użyj number_format () jako odpowiedzi podanej przez Codemwnci ):

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

Z instrukcji:

Opis:

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

Zwraca zaokrągloną wartość valdo podanej precision(liczba cyfr po przecinku). precisionmoże być również ujemny lub zero (domyślnie).

...

Przykład 1. round()przykłady

<?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
?>

Przykłady przykładów trybu 2

<?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
źródło
5
@khuderm round($number, 2);nie działa. Chcę 520.00, a nie 520. Nie mogę uwierzyć, że round nie robi tego domyślnie.
Claudiu Creanga
2
Nawet nie odpowiada poprawnie na OP, ale ma ponad 100 głosów!
Rob Sedgwick
200

Alternatywnie,

$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
Marc B.
źródło
3
A co jeśli chcesz 520,00? Myślę, że druga odpowiedź działa lepiej w tym przypadku.
SPRBRN
2
^ nie, inna odpowiedź nie da dwóch miejsc po przecinku dla int
pythonian29033,
1
inne powody, dla których możesz tego chcieć, to to, że nie chcesz zaokrąglać ... lub z mojej przyczyny zwrócone
zmiennoprzecinkowe
34

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

na przykład

echo round(5.045, 2);    // 5.05

echo round(5.055, 2);    // 5.06
SystemX17
źródło
Round wykona dokładnie taką funkcjonalność, jakiej chce Rich, ale bardziej interesujące byłoby zastosowanie funkcji number_format () dla wszelkiego rodzaju formatowania numerycznego.
Shamim Hafiz,
Ta metoda będzie również wykonywać zaokrąglanie, po prostu zmuszając cyfry „.00” na końcu.
SystemX17,
10
Próbowałem zaokrąglić, ale to nie działa - nie doda dodatkowych 0,00.
Rich Bradshaw,
Spróbuj użyć jednego z przykładów, które tam mam, które są same w skrypcie PHP. Powinieneś dostać skomentowany wynik. Jeśli nie, to masz problem z konfiguracją PHP.
SystemX17
1
runda (520, 2) zwraca 520, a nie 520,00 zgodnie z wymaganiami @Rich
user761100
25

Próbować:

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

Dane wyjściowe będą:

1,234,545,454.00
Biju
źródło
2
To działa, ale wynik będzie ciągiem, a nie liczbą.
Ethan
1
jeśli chcesz użyć format_ liczbowy, ustaw przynajmniej format_ liczbowy ($ number, 2, '.', '')
Mihai P.
14

Możesz użyć PHP printflub sprintffunkcji:

Przykład z sprintf:

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

Możesz uruchomić to samo bez echo. Przykład:sprintf("%.3f", $num);

Wynik:

2.120

Alternatywnie z printf:

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

Wynik:

2.124
Aditya P Bhatt
źródło
12

Innym bardziej egzotycznym sposobem rozwiązania tego problemu jest użycie bcadd()fałszywej wartości dla $ right_operand of 0.

$formatted_number = bcadd($number, 0, 2);
powtac
źródło
2
Pamiętaj, że bc*funkcje nie zaokrąglają w górę, zawsze zaokrąglają w dół. Na przykład bcadd("1.0999","0.0",1)daje „1,0”, a nie „1,1”.
ColinM
1
Funkcje BC Math po prostu przestają przetwarzać $scalecyfry ułamkowe. Odpowiada to zaokrągleniu do zera.
Ali
11

Użyj funkcji PHP number_format () .

Na przykład,

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

Dane wyjściowe będą:

7,234,545,423.00
Sani Kamal
źródło
7

round_to_2dp jest funkcją zdefiniowaną przez użytkownika i nic nie można zrobić, dopóki nie opublikujesz deklaracji tej funkcji.

Myślę jednak, że robi to: number_format($number, 2);

ajreal
źródło
14
Od pierwszego akapitu myślę, że źle zrozumiałeś pytanie. round_to_2dp($number);miał oznaczać pseudokod; OP poprosił, aby ktoś powiedział mu, co zastąpić to wyrażenie.
Mark Amery
7
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point

Wyświetlą się dokładnie dwie cyfry po przecinku.

Korzyść:

Jeśli chcesz wyświetlać dwie cyfry tylko po wartości zmiennoprzecinkowej, a nie int, użyj tego.

Wasim A.
źródło
Jest to najbardziej uniwersalne rozwiązanie, jeśli masz bcdiv (jest to standardowy, ale nie domyślny pakiet na centos6).
Shovas
6
$twoDecNum = sprintf('%0.2f', round($number, 2));

Zaokrąglenie poprawnie zaokrągla liczbę, a sprintf zmusza ją do 2 miejsc po przecinku, jeśli zdarzy się, że jest to tylko 1 miejsce po przecinku po zaokrągleniu.

JohnS
źródło
6
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', ''); 

Zwróci 5,98 bez zaokrąglania liczby.

mrphpguru
źródło
Tylko to może również wykonać zadanie floor($retailPrice * 100) / 100;bez potrzeby formatowania liczb.
somsgod
6

Do zaokrąglenia warunkowego tj. pokaż dziesiętne tam, gdzie jest to naprawdę potrzebne, w przeciwnym razie liczba całkowita

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    
Viney
źródło
6

Tworzę własne.

$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
joanlgr
źródło
1
Miło jest zobaczyć niektóre matematyki potrzebne do tego. Chociaż korzystanie z wbudowanej funkcji jest dla mnie preferowane. Nie ma sensu ponownie wymyślać koła.
Żarówka 1
1
Niestety, ale round (), jak to mówi, round de number, a czasami nie chcę zaokrąglać.
joanlgr,
5

Tutaj dostaję dwa miejsca po przecinku za .(kropką) za pomocą funkcji ...

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;
}

Wyniki powyższej funkcji:

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

Nowa poprawna odpowiedź

Użyj natywnej funkcji PHP 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
Pan HK
źródło
4
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89

Otrzymasz 2 cyfry po przecinku.

S'copion Sam
źródło
4
Nie, nie będzie. Nie wiem, kiedy ten post został napisany, ale jeśli spróbujesz go na własnym przykładzie, przynajmniej na moim komputerze :-), wyświetli 520.90. Oznacza to, że wystąpi zaokrąglenie. Bądź ostrożny!
Boaz Rymland 17.03.16
4

Jeśli chcesz używać dwóch cyfr dziesiętnych w całym projekcie, możesz zdefiniować:

bcscale(2);

Następnie następująca funkcja wygeneruje pożądany rezultat:

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

Ale jeśli nie używasz funkcji bcscale, musisz napisać kod w następujący sposób, aby uzyskać pożądany wynik.

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

Wiedzieć więcej

jewelhuq
źródło
2

Liczba bez rundy

$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);
Abhishek Sharma
źródło
1

Oto inne rozwiązanie ze strtok i str_pad :

$num = 520.00
strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')
Bryan
źródło
0

Dodając do innych odpowiedzi, ponieważ liczba_format () domyślnie doda separator tysięcy.

Aby to usunąć, wykonaj następujące czynności:

$number = number_format($number, 2, ".", "");
Ivan Ivković
źródło
0
  • Wybierz liczbę miejsc po przecinku
  • Formatuj przecinki (,)
  • Opcja przycinania końcowych zer

Raz i na zawsze!

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;
}

Przykłady

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
źródło
-5

Możesz użyć funkcji round () 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
Sadikhasan
źródło
3
-1; ta odpowiedź nie dodaje nic nowego, że odpowiedź Somnatha Muluka nie zawierała już 2 lata wcześniej.
Mark Amery
1
Jest to również błędne, jak zauważono w moim komentarzu do odpowiedzi Somnatha.
Mark Amery