2016-09-21 1 views
0

Ich muss reale Werte dividiert durch eine positive Konstante auf nächste niedrigere Ganzzahl ausrichten, unabhängig von ihrem Vorzeichen. Beispiel sind (hier steht der Backslash für meinen Wunsch-Operator)Division, die abgerundet und nicht abgeschnitten

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

Gibt es einen kurzen Operator, der das tut? der übliche "Schrägstrich" ("/") -Operator läuft in C++ (das wurde vor einiger Zeit standardisiert) auf Null (z. B. -52.6/2 = -26).

+4

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

+1

Nein, es gibt keinen solchen Operator in C++ –

+0

Float-Division macht überhaupt keine Rundung. '-52.6/2' ist' -26.30000000000000071054273576010018587112427' auf meinem Rechner. – molbdnilo

Antwort

2

std::floor wird Ihr Problem lösen.

#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; 
} 

Ausgang:

-11 
10 
5 
-6 
0

Wir haben keine speziellen Operator für sie haben, aber wir konnten eine spezielle Art machen und neu zu definieren entsprechenden Operatoren:

#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'; 
} 

Erwartete Ausgabe:

-29 
-15 
+0

OP wollte reelle Zahlen durch ganze Zahlen teilen, nicht ganze Zahlen durch ganze Zahlen. Ich denke, eine Funktion wäre dafür intuitiver als eine Klasse. – anatolyg

+0

@anatolyg Seltsamerweise, obwohl das Template-Argument 'Integer' heißt, wird diese Klasse auch für reelle Zahlen funktionieren. Aber ich bin mir sicher, dass Sie mit der Intuitivität recht haben. –