Ce face bcround / bcceil / bcfloor
Extensia BCMath lucrează cu numere scrise ca șiruri ("19.99") și le calculează exact, cifră cu cifră. Este potrivită pentru bani, unde 0.1 + 0.2 nu are voie să dea 0.30000000000000004.
Din PHP 8.4, BCMath are și funcții de rotunjire: bcround rotunjește la un număr de zecimale, bcceil la întregul următor în sus, bcfloor la întregul următor în jos. Tot din PHP 8.4 există bcdivmod (câtul și restul deodată) și clasa BcMath\Number, care permite operatorii obișnuiți (+, -, *, /).
Pentru bcround, modul implicit este „jumătatea se rotunjește departe de zero” (2.5 devine 3, -2.5 devine -3). Alte moduri vin din enumerarea RoundingMode, de exemplu RoundingMode::HalfEven (rotunjirea bancherului).
Parametri
| Parametru | Descriere |
|---|---|
$num |
Numărul, ca șir: "12.345". |
$precision |
Numărul de zecimale păstrate (implicit 0). Poate fi negativ: -1 rotunjește la zeci. |
$mode |
Modul de rotunjire, o valoare din enumerarea RoundingMode. |
Ce returnează
Rezultatul ca șir de caractere.
Exemple
Exemplul 1: Rotunjire la bani
<?php
$total = bcmul("19.99", "1.21", 4);
echo "Calcul exact: $total\n";
echo "De plată: " . bcround($total, 2) . " lei\n";
echo "În sus: " . bcceil($total) . "\n";
echo "În jos: " . bcfloor($total);
Rezultat
Calcul exact: 24.1879
De plată: 24.19 lei
În sus: 25
În jos: 24
Exemplul 2: Moduri de rotunjire
<?php
echo bcround("2.5") . "\n";
echo bcround("-2.5") . "\n";
echo bcround("2.45", 1, RoundingMode::HalfEven) . "\n";
echo bcround("1234.5", -2);
Rezultat
3
-3
2.4
1200
Exemplul 3: BcMath\Number și bcdivmod
Obiectele BcMath\Number se adună și se compară cu operatorii obișnuiți, iar rezultatul rămâne exact.
<?php
use BcMath\Number;
$suma = new Number("0.1") + new Number("0.2");
echo $suma . "\n";
var_dump($suma == new Number("0.3"));
var_dump(0.1 + 0.2 == 0.3);
[$cutii, $rest] = bcdivmod("17", "5");
echo "17 sticle: $cutii cutii a câte 5 și $rest sticle rămase";
Rezultat
0.3
bool(true)
bool(false)
17 sticle: 3 cutii a câte 5 și 2 sticle rămase
Greșeli frecvente
- Dai un
floatîn loc de șir:bcround(0.1 + 0.2, 2). Valoarea este deja imprecisă înainte să ajungă la BCMath. Scrie numerele ca șiruri. - Te aștepți ca
bcceil("-3.1")să dea-4. „În sus” înseamnă spre plus infinit: rezultatul este-3, iarbcfloor("-3.1")dă-4. - Folosești funcțiile pe un server fără extensia
bcmath(lipsește din unele instalări minimale) și primeștiCall to undefined function.
Comenzi înrudite
round: Rotunjește un număr la cel mai apropiat întreg sau la un număr de zecimale.fdiv: Împarte două numere după standardul IEEE 754: împărțirea la zero dă INF sau NAN, nu eroare.intdiv: Împarte două numere întregi și returnează doar partea întreagă a rezultatului.number_format: Formatează un număr cu zecimale și separator de mii, de exemplu 1.299,50.