std::floor în C++

Rotunjește în jos la cel mai apropiat întreg (floor) sau în sus (ceil).

Sintaxă
double floor(double x);  // rotunjire în jos
double ceil(double x);   // rotunjire în sus

Ce face std::floor

std::floor(x) returnează cel mai mare întreg care nu depășește x; std::ceil(x) returnează cel mai mic întreg care nu este mai mic decât x. Rezultatul are tot tip cu virgulă (double), deci îl convertești explicit dacă ai nevoie de int.

La numere negative, „în jos” înseamnă spre minus infinit: floor(-2.3) = -3. Dacă vrei doar să tai zecimalele, folosește std::trunc.

Parametri

Parametru Descriere
x Numărul rotunjit.

Ce returnează

Valoarea rotunjită, ca double.

Exemple

Exemplul 1: Pozitive și negative

#include <cmath>
#include <print>

int main() {
    for (double x : {2.3, 2.7, -2.3, -2.7, 5.0}) {
        std::println("{:>5}: floor = {:>3}, ceil = {:>3}", x, std::floor(x), std::ceil(x));
    }
}

Rezultat

  2.3: floor =   2, ceil =   3
  2.7: floor =   2, ceil =   3
 -2.3: floor =  -3, ceil =  -2
 -2.7: floor =  -3, ceil =  -2
    5: floor =   5, ceil =   5

Exemplul 2: Câte autobuze și câte pagini

#include <cmath>
#include <print>

int main() {
    int elevi = 103;
    int locuri = 45;
    int autobuze = static_cast<int>(std::ceil(static_cast<double>(elevi) / locuri));
    std::println("Pentru {} elevi sunt necesare {} autobuze", elevi, autobuze);

    // pentru întregi pozitivi, aceeași rotunjire în sus fără double:
    std::println("Pagini a câte 10 produse pentru 57 de produse: {}", (57 + 10 - 1) / 10);

    double bani = 47.99;
    std::println("Bancnote întregi de 1 leu: {}", std::floor(bani));
}

Rezultat

Pentru 103 elevi sunt necesare 3 autobuze
Pagini a câte 10 produse pentru 57 de produse: 6
Bancnote întregi de 1 leu: 47

Greșeli frecvente

  • Scrii std::ceil(elevi / locuri) cu două int: împărțirea întreagă taie deja zecimalele (103 / 45 = 2) și ceil nu mai are ce rotunji. Convertește un operand la double.

Comenzi înrudite

  • std::round: Rotunjește la cel mai apropiat întreg; la jumătate (x,5) rotunjește în direcția opusă lui zero.
  • std::trunc: Taie partea zecimală a unui număr, rotunjind spre zero.
  • std::fmod: Calculează restul împărțirii a două numere cu virgulă (echivalentul lui % pentru double).