2016-09-21 5 views
0

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

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

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

+4

'std :: floor (a/b)' – Leon

+1

Нет такого оператора в C++ –

+0

Float division вообще не делает округления. '-52.6/2' есть' -26.30000000000000071054273576010018587112427' на моей машине. – molbdnilo

ответ

2

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 
0

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

#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

OP хотел разделить действительные числа целыми числами, а не целыми целыми числами. Я думаю, что функция будет более интуитивной для этого, чем для класса. – anatolyg

+0

@anatolyg достаточно странно, хотя аргумент шаблона называется 'Integer', этот класс будет работать и для действительных чисел. Тем не менее, я уверен, что ты прав насчет интуитивности. –

 Смежные вопросы

  • Нет связанных вопросов^_^