2016-02-18 3 views
8

Ich dachte, das wäre ziemlich einfach, aber ich kann nicht scheinen, es auszuarbeiten oder eine vorhandene Frage zu finden, die meine Situation abdeckt.In Swift, wie ich einen Prozentwert auf- oder abgerundet ohne Dezimalstellen anzeigen

Ursprünglich stellte ich eine Reihe von Variablen wie folgt zusammen:

var score :Int! = 0 
var totalquestionsasked :Int! = 0 
var percentagecorrect :Int! = 0 

Dies habe alle meine Werte Berechnung in Ordnung, aber ich lief in Probleme mit dem Prozentsatz.

Meine Grundformel für den Prozentsatz ist:

percentagecorrect = score/totalquestionsasked * 100 

Allerdings konnte ich das nicht angezeigt bekommen, wenn der Wert in einer Textbeschriftung verwendet wird.

Also nach einigen Recherchen habe ich dazu meine Variablen geändert statt:

var score :Double = 0.0 
var totalquestionsasked :Double = 0.0 
var percentagecorrect :Double = 0.0 

und verwendet immer noch die gleiche Formel für den Prozentsatz:

percentagecorrect = score/totalquestionsasked * 100 

Doch während dies in Ordnung angezeigt, ich didn Ich will nicht alle Dezimalstellen. Nach etwas mehr Recherche stieß ich in einer anderen Frage auf eine Erweiterung und passte sie für meine Anwendung an. Meine Erweiterung ist:

extension Double { 
    var roundTo0f: Double {return Double(round(1*self)/1) } 
    var roundTo1f: Double {return Double(round(10*self)/10) } 
    var roundTo2f: Double {return Double(round(100*self)/100) } 
    var roundTo3f: Double {return Double(round(1000*self)/1000) } 
} 

Und ich habe versucht, die Erweiterung wie folgt verwendet:

percentagecorrect = score/totalquestionsasked * 100 
let percentagevalue: Double = percentagecorrect.roundTo0f 
labelPercent.text = "\(percentagevalue)" 

Das Endergebnis ist, dass dies ziemlich nah dran ist, was ich will. Es zeigt jedoch immer noch den Prozentwert auf 1 Dezimalstelle an. (Nebenbei, es ist nicht genau - was ich meine ist, dass, wenn die Partitur 1 ist und die Anzahl der Fragen ist gefragt 3, der obige Code den Prozentsatz als 33,0 statt 33,3 zeigt, aber ich schweife ab)

Was ich eigentlich will, ist der Wert, der auf die nächste ganze Zahl auf- oder abgerundet wird, bevor der Wert angezeigt wird. Mit anderen Worten will, was ich ist

  • , wenn der Wert 33,3 für sie ist bis 33 und Anzeige abrunden als 33
  • , wenn der Wert 66,6 für sie ist bis 67 und Anzeige aufrunden als 67

Das ist ich will keine Dezimalstellen im angezeigten Ergebnis. Momentan läuft es richtig auf und ab, aber am Ende wird ".0" angezeigt. Wenn dies nicht möglich ist, möchte ich, dass es korrekt auf einer Dezimalstelle angezeigt wird.

Ich bin neu in der Programmierung und Swift ist die erste Sprache, die ich versuche zu lernen, also vielleicht ist dies nur ein Anfängerfehler, aber ich kann wirklich nicht finden, was ich falsch mache.

Wie bekomme ich das zur Arbeit?

Antwort

9

Sie können die integrierte Rundenfunktion verwenden und zu einem Int.

print(Int(round(33.3))) 
print(Int(round(66.6))) 

Wenn Sie eine Erweiterungsmethode wollen eine Zeichenfolge zurückgeben, können Sie diese verwenden:

extension Double { 
    func roundTo(decimalPlaces: Int) -> String { 
     return NSString(format: "%.\(decimalPlaces)f", self) as String 
    } 
} 
+0

Das ist alles für mich sehr neu, so dass es mir dauerte eine Weile, aber ich endlich diese zu arbeiten. Vielen Dank! – Monomeeth

1

In reinen Integer-Arithmetik,

var score : Int = ... 
var totalquestionsasked : Int = ... 
let percentagecorrect = (score * 200 + totalquestionsasked)/(2 * totalquestionsasked) 

würde den Trick tun.


Wie funktioniert das? Berechnen des Prozentsatzes als

(score * 100)/totalquestionsasked 

kürzt das Ergebnis der Division in Richtung Null. Für das gewünschte Rundungsverhalten, würden wir

(score * 100)/totalquestionsasked + 1/2 

in Gleitpunktarithmetik gestutzt und dann das Ergebnis auf eine ganze Zahl zu berechnen haben. Kombination Begriffe geben dem Ausdruck

(score * 200 + totalquestionsasked)/(2 * totalquestionsasked) 

die, wenn sie in ganzzahliger Arithmetik berechnet wird, das korrekte Ergebnis liefert.

+0

Danke, dass du auch deine Antwort erklärst (für einen Neuling ist es sehr hilfreich). Ich muss etwas falsch machen - ich bekomme ein Ergebnis von 100,5% für eine Punktzahl von 1 von 1 gestellten Fragen. Verwenden Sie Ihren vorgeschlagenen Code an der falschen Stelle? Gegenwärtig habe ich 'percentagecorrect = score/totalquestionsasked * 100' ersetzt mit' var percentagecorrect = (score * 200 + totalquestionsasked)/(2 * totalquestionsasked) '? – Monomeeth

+0

@Monomeeth: Beachten Sie, dass ich "Int" Variablen für Score und Totalquestions verwendet habe, nicht "Double". Mein "Trick" funktioniert nur mit Ganzzahlen. Wenn Sie Gleitkommazahlen verwenden, wäre 'round()' - wie in der anderen Antwort - das Richtige. –

+0

Ok, also, wenn ich meine Variablen wieder in Ganzzahlen änderte, wie ich sie ursprünglich hatte, würde ich richtigerweise annehmen, dass der Prozentsatz nicht als eine Zeichenkette im Code angezeigt wird wie 'labelPercent.text =" \ (Prozentwert) "'? – Monomeeth

1

Sie können den Formatspezifizierer von NSString verwenden und ihn Ihrer Double -Erweiterung als Funktionen hinzufügen.

extension Double 
{ 
    func roundTo0f() -> NSString 
    { 
    return NSString(format: "%.0f", self) 
    } 

    func roundTo1f() -> NSString 
    { 
    return NSString(format: "%.1f", self) 
    } 

    func roundTo2f() -> NSString 
    { 
    return NSString(format: "%.2f", self) 
    } 

    func roundToNf(n : Int) -> NSString 
    { 
    return NSString(format: "%.\(n)f", self) 
    } 
} 

let d : Double = 9.12 
print(d.roundTo0f()) 
print(d.roundTo1f()) 
print(d.roundTo2f()) 
+0

Ich konnte nicht scheinen, dass dies funktioniert. Ich meine, das Endergebnis ist das gleiche für mich. Aber da ich neu bei all dem bin, vermisse ich wahrscheinlich nur etwas Offensichtliches. – Monomeeth

+0

Welche Werte haben Sie versucht? –

+0

Ok, ich muss wirklich etwas verpassen. Die Werte werden nur durch den Code generiert, wie in meiner Frage beschrieben. Wenn ich Ihren Code verwendet habe, ist die Berechnung sicherlich korrekt, aber es zeigt immer noch die Dezimalpunktwerte in der Beschriftung an, die durch meinen 'labelPercent.text =" \ (Prozentwert) "' Code gefüllt wird. – Monomeeth

0

Sie können die Runde selbst erledigen. Ich gehe von einer Eins-zu-eins-Bewertung aus. Ich habe einige Nummern angeschlossen, damit du sie auf einen Spielplatz einfügen kannst. Sie können den Wert in "If left" ändern, wenn Sie möchten. .51 usw. Nur weil das IRS Sie bei 50 Cent abrundet, heißt das nicht, dass Sie müssen.

var score :Double! = 359 
var totalquestionsasked :Double! = 400 
var percentagecorrect :Double! = (score/totalquestionsasked) * 100 
var left = percentagecorrect - Double(Int(percentagecorrect)) 
if left >= 0.50 { 

    percentagecorrect = percentagecorrect + 1.0 

} 
var answer = Int(percentagecorrect) 
0

können Sie diese Erweiterung verwenden:

extension Double { 
/// Rounds the double to decimal places value 
func roundToPlaces(places:Int) -> Double { 
    let divisor = pow(10.0, Double(places)) 
    return round(self * divisor)/divisor 
} 
} 
Verwandte Themen