2014-09-16 6 views
7

Es scheint, dass die Ganzzahldivisionen in Swift eher in Richtung Null als in Richtung der niedrigeren Zahl verlaufen. Das bedeutet zum Beispiel, dass -1/2 0 statt -1 ist.Runder negativer ganzzahliger Quotient in Richtung negatives Unendliches

Gibt es eine Möglichkeit, Swift zu sagen, dass er sich auf die niedrigere Zahl hin drehen soll? Ich weiß, wie ich es "simulieren" kann, aber wenn es eine native Lösung gibt, würde ich es lieber verwenden.

Antwort

0

Die Bodenfunktion rundet so ab, wenn Sie floor(Float(a)/Float(b)) tun, sollte es funktionieren.

infix operator </> { associativity left } 
func </> (a: Int, b: Int) -> Int { 
    return Int(floor(Double(a)/Double(b))) 
} 

so dass Sie sich nicht, dass die absurde Ausdruck geben:

+1

Das wäre 'Int (Boden (Float (a)/Float (b))), obwohl. Bestimmt nicht für schwache Nerven. – zneak

1

Sie können Ihre eigenen Operator wie folgt definieren. Ich schlage </> vor, aber natürlich können Sie Ihr eigenes wählen.

Wenn Sie nicht wie Operatoren erstellen, dann ist es als eine normale Funktion:

func div (a: Int, b: Int) -> Int { 
    return Int(floor(Double(a)/Double(b))) 
} 

Last, aber ich persönlich würde nicht es verwenden, können Sie neu definieren den Divisionsoperator:

func/(a: Int, b: Int) -> Int { 
    return Int(floor(Double(a)/Double(b))) 
} 

und in diesem Fall ist es für alle Divisionen angewandt werden - von Nebenwirkungen bewusst sein, obwohl

0

Die Backup-Lösung, die ich habe, beinhaltet einen neuen Operator -/. Die Mathematik besteht nicht darin, zwischen Doppelpunkten und Ganzzahlen hin- und herzuwechseln, wodurch Randfälle mit sehr großen Zahlen vermieden werden. Auf der anderen Seite kann dies stattdessen überlaufen, wenn sowohl denominator als auch numerator sehr große negative Zahlen sind, und ich bin mir nicht sicher, was genau passiert, wenn denominator negativ ist.

infix operator -/ { 
    precedence 150 
    associativity left 
} 

func -/ (numerator: Int, denominator: Int) -> Int { 
    if numerator < 0 { 
     return (numerator - (denominator - 1))/denominator 
    } 
    return numerator/denominator 
} 

Alle in Bezug auf die Swift geschrieben Lösung wird wahrscheinlich mit seinem Anteil von Fragen am Ende, wenn Sie C Verhalten emulieren möchten. Eine andere Möglichkeit wäre, eine winzige divide Funktion in den Überbrückungs-Header aufzunehmen und den Operator damit zu implementieren.