Подразделение, которое округляет, а не усекает

Мне нужно выровнять действительные значения, деленные на некоторую положительную константу, с ближайшим более низким целым числом, независимо от их знака. Примером является (здесь обратный слеш представляет мой желаемый оператор)

21,5 \ 2 = 10
-21,5 \ 2 = -11
52,3 \ 2 = 26
-52,3 \ 2 = -27

Есть ли короткий оператор, который это делает? обычный оператор «косой черты» («/») округляется до нуля в C ++ (это было сделано стандартом некоторое время назад) (например, -52,6 / 2 = -26).

0

Решение

std::floor решит вашу проблему.

#include <iostream>
#include <cmath>
using namespace std;

int main() {
// your code goes here
float i = -21.5,b=2;
int c = std::floor(i/b);
cout << c << endl;

i = 21.5,b=2;
c = std::floor(i/b);
cout << c << endl;

int a = 11,b1 =2;
c = std::floor(a/b1);
cout << c << endl;

a = -11;
b =2.1;
c = std::floor(a/b);
cout << c << endl;
return 0;
}

Выход:

-11
10
5
-6
2

Другие решения

У нас нет специального оператора для этого, но мы могли бы создать специальный тип и переопределить соответствующие операторы:

#include <iostream>
#include <cmath>

template<class Integer>
struct RoundDown
{
RoundDown(Integer v) : value_(v) {}

operator Integer&() { return value_; }
operator const Integer&() const { return value_; }

template<class Other>
RoundDown& operator/=(Other const& o)
{
value_ = Integer(std::floor(double(value_) / o));
return *this;
}

Integer value_;
};

template<class IntegerL, class IntegerR>
auto operator/(RoundDown<IntegerL> l, IntegerR const& r)
{
return l /= r;
}

int main()
{
RoundDown<int> a { -57 };
a /= 2;
std::cout << a << '\n';
std::cout << (a / 2) << '\n';
}

Ожидаемый результат:

-29
-15
0

По вопросам рекламы [email protected]