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)에서 0으로 반올림됩니다. 예를 들어, "slash"("/") 연산자는 0으로 반올림됩니다.

+4

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

+1

C++에 해당 연산자가 없습니다. –

+0

플로트 나누기가 전혀 반올림하지 않습니다. '-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'라고하더라도,이 클래스는 실수에 대해서도 작동합니다. 그러나 직감에 대해 당신이 옳다고 확신합니다. –