bcround / bcceil / bcfloor în PHP

Rotunjesc numere zecimale scrise ca text, fără erorile de precizie ale float: bcround la n zecimale, bcceil în sus, bcfloor în jos.

Sintaxă
bcround(string $num, int $precision = 0, RoundingMode $mode = RoundingMode::HalfAwayFromZero): string
bcceil(string $num): string
bcfloor(string $num): string

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, iar bcfloor("-3.1") dă -4.
  • Folosești funcțiile pe un server fără extensia bcmath (lipsește din unele instalări minimale) și primești Call 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.