552 Stimmen

Runden eines Double-Werts auf x Dezimalstellen in Swift

Kann mir jemand sagen, wie man einen Double-Wert auf x Dezimalstellen in Swift rundet?

Ich habe:

var totalWorkTimeInHours = (totalWorkTime/60/60)

Wobei totalWorkTime eine NSTimeInterval (Double) in Sekunden ist.

totalWorkTimeInHours gibt mir die Stunden, aber es gibt mir die Zeit in einer so langen präzisen Zahl, z.B. 1.543240952039......

Wie kann ich das auf z.B. 1.543 abrunden, wenn ich totalWorkTimeInHours drucke?

4voto

Um Float-Unvollkommenheiten zu vermeiden, verwenden Sie Decimal

extension Float {
    func rounded(rule: NSDecimalNumber.RoundingMode, scale: Int) -> Float {
        var result: Decimal = 0
        var decimalSelf = NSNumber(value: self).decimalValue
        NSDecimalRound(&result, &decimalSelf, scale, rule)
        return (result as NSNumber).floatValue
    }
}

Bsp.
1075.58 wird zu 1075.57 gerundet, wenn Float mit einer Genauigkeit von 2 und .down verwendet wird
1075.58 wird zu 1075.58 gerundet, wenn Decimal mit einer Genauigkeit von 2 und .down verwendet wird

4voto

Amais Sheikh Punkte 441
var n = 123.111222333
n = Double(Int(n * 10.0)) / 10.0

Ergebnis: n = 123.1

Ändern Sie 10.0 (1 Dezimalstelle) in beliebig von 100.0 (2 Dezimalstellen), 1000.0 (3 Dezimalstellen) und so weiter, für die Anzahl der Dezimalstellen, die Sie nach dem Dezimalpunkt möchten.

2voto

Sie können diese Erweiterung hinzufügen:

extension Double {
    var clean: String {
        return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(format: "%.2f", self)
    }
}

und rufen Sie es so auf:

let ex: Double = 10.123546789
print(ex.clean) // 10.12

2voto

OwlOCR Punkte 1009

Hier ist einer für SwiftUI, wenn Sie ein Textelement mit dem Zahlenwert benötigen.

 struct RoundedDigitText : View {
    lass Ziffern : Int
    lass Nummer : Double

    var Körper: einige Sicht {
        Text(String (format: "%.\(digits)f", number))
    }
}

2voto

Mountain Man Punkte 252

Ich habe das gefunden und frage mich, ob es möglich ist, die Eingabe eines Benutzers zu korrigieren. Das heißt, wenn sie anstelle von zwei Dezimalstellen drei Dezimalstellen für einen Dollarbetrag eingeben. Sagen wir 1,111 statt 1,11, können Sie es durch Runden korrigieren? Die Antwort aus vielen Gründen ist nein! Mit Geld würde alles über d.h. 0,001 irgendwann Probleme in einem echten Scheckbuch verursachen.

Hier ist eine Funktion, um die Benutzereingabe auf zu viele Werte nach dem Punkt zu überprüfen. Aber die 1. erlaubt, 1.1 und 1.11.

Es wird angenommen, dass der Wert bereits auf erfolgreiche Umwandlung von einem String in ein Double überprüft wurde.

//func muss dort sein, wo transactionAmount.text im Geltungsbereich ist

func checkDoublesForOnlyTwoDecimalsOrLess()->Bool{

    var theTransactionCharacterMinusThree: Character = "A"
    var theTransactionCharacterMinusTwo: Character = "A"
    var theTransactionCharacterMinusOne: Character = "A"

    var result = false

    var periodCharacter:Character = "."

    var myCopyString = transactionAmount.text!

    if myCopyString.containsString(".") {

         if( myCopyString.characters.count >= 3){
                        theTransactionCharacterMinusThree = myCopyString[myCopyString.endIndex.advancedBy(-3)]
         }

        if( myCopyString.characters.count >= 2){
            theTransactionCharacterMinusTwo = myCopyString[myCopyString.endIndex.advancedBy(-2)]
        }

        if( myCopyString.characters.count > 1){
            theTransactionCharacterMinusOne = myCopyString[myCopyString.endIndex.advancedBy(-1)]
        }

          if  theTransactionCharacterMinusThree  == periodCharacter {

                            result = true
          }

        if theTransactionCharacterMinusTwo == periodCharacter {

            result = true
        }

        if theTransactionCharacterMinusOne == periodCharacter {

            result = true
        }

    }else {

        //wenn kein Punkt vorhanden ist und es sich um ein gültiges Double handelt, ist es gut          
        result = true

    }

    return result

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X