2014-09-16 11 views
7

Wygląda na to, że liczby całkowite w Swift są zaokrąglane w kierunku zera, a nie w kierunku mniejszej liczby. Oznacza to na przykład, żebędzie 0 zamiast -1.Okrągły ujemny stosunek liczby całkowitej do ujemnej nieskończoności

Czy istnieje sposób, aby powiedzieć Swiftowi, aby zaokrąglił w kierunku niższej liczby? Wiem, jak mogę "symulować" to, ale jeśli istnieje rozwiązanie natywne, wolałbym go użyć.

Odpowiedz

0

Funkcja podłogi działa w dół, więc jeśli wykonasz floor(Float(a)/Float(b)), powinna działać.

+1

To byłby 'Int (podłoga (Float (a)/Float (b))), chociaż. Zdecydowanie nie dla osób o słabym sercu. – zneak

1

Można zdefiniować własne operatora tak:

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

tak, że nie trzeba wpisywać tej absurdalnej wypowiedzi. Proponuję </>, ale oczywiście możesz wybrać własną.

Jeśli nie podoba tworzenia operatorów, a następnie użyć go jako normalnego funkcjonowania:

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

Ostatnio, ale osobiście bym nie go używać, można przedefiniowania operatora dzielenia:

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

iw tym przypadku będzie on stosowany do wszystkich działów - być świadomi skutków ubocznych choć

0

Rozwiązanie kopii zapasowej, które mam do czynienia z nowym operatorem -/. Matematyka nie obejmuje tasowania w przód i w tył między podwójnymi i całkowitymi, co pozwala uniknąć pewnych skrajnych przypadków z bardzo dużymi liczbami. Z drugiej strony może to spowodować przepełnienie, jeśli zarówno denominator i numerator są bardzo duże liczby ujemne, i nie jestem pewien, co stanie się dokładnie, jeśli denominator jest ujemna.

infix operator -/ { 
    precedence 150 
    associativity left 
} 

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

Każde rozwiązanie napisane pod kątem Swift prawdopodobnie zakończy się udziałem zagadnień, jeśli chcesz emulować zachowanie C. Inną możliwością jest dołączenie małej funkcji divide do nagłówka pomostowego i zaimplementowanie operatora za pomocą tej funkcji.

Powiązane problemy