Zaokrąglij w górę do dwóch miejsc po przecinku


85

Jak zaokrąglić currentRatiodo dwóch miejsc po przecinku?

let currentRatio = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)!
railRatioLabelField.text! = "\(currentRatio)"

Czy chcesz zaokrąglić tylko currentRatiodo dwóch miejsc po przecinku, czy zawsze w górę? Np .: czy chcesz 3,141 -> 3,14 czy 3,141 -> 3,14?
JAL,

Cześć JAL, chcę, aby 3.149 było wyświetlane jako 3.15. Jednak 3.141 powinno wyświetlać 3.14. Dzięki
Del Hinds

Zobacz pierwszą część mojej odpowiedzi dla prawidłowego zaokrąglenia.
JAL,

Odpowiedzi:


171

Użyj ciąg formatu zaokrąglić w górę do dwóch miejsc po przecinku i przekonwertować doubleDo String:

let currentRatio = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)!
railRatioLabelField.text! = String(format: "%.2f", currentRatio)

Przykład:

let myDouble = 3.141
let doubleStr = String(format: "%.2f", myDouble) // "3.14"

Jeśli chcesz zaokrąglić ostatnie miejsce po przecinku, możesz zrobić coś takiego (dzięki Phoen1xUK):

let myDouble = 3.141
let doubleStr = String(format: "%.2f", ceil(myDouble*100)/100) // "3.15"

W przypadku zaokrąglania do dwóch miejsc po przecinku musi wynosić 3,15.
Matt Le Fleur,

Myślałem, że OP chce tylko zaokrąglić do dwóch miejsc po przecinku, w razie potrzeby zaokrąglając w górę lub w dół. Właśnie dodałem komentarz z prośbą o wyjaśnienie.
JAL,

Cześć Jal, Dziękuję, użyłem Twojej odpowiedzi, która działała z niewielką modyfikacją w następujący sposób: - _ = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)! railRatioLabelField.text! = String (format: "% .2f", currentRatio)
Del Hinds

2
To odpowiedź jest na pytanie: "Jak wyświetlić podwójne z dwiema cyframi w etykiecie tekstowej" lub "... jako ciąg znaków", ta odpowiedź nie odpowiada na pytanie "Zaokrąglij podwójnie do 2 miejsc po przecinku"
mnl

@JAL potrzebuję olny .5 lub 0 po punkcie Na przykład. jeśli mamy 23,4, to powinno dać 23,5, a jeśli 23,8, powinno to 24,0
guru

29

(Swift 4.2 Xcode 11) Proste w użyciu rozszerzenie: -

extension Double {
    func round(to places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}

Posługiwać się:-

if let distanceDb = Double(strDistance) {
   cell.lblDistance.text = "\(distanceDb.round(to:2)) km"
}

Znakomity. Właściwie chciałem przekonwertować na tę samą właściwość (podwójną). Twoje rozszerzenie rozwiązało mój problem. Dziękuję Ci!
Marcelo dos Santos

:-) Miłego kodowania
Mehul

Myślę, że twoja jest poprawną odpowiedzią. Chciałbym tylko dodać modyfikację składni do funkcji. func round(to places: Int) -> Double {
23inhouse

1
@ 23inhouse, zaktualizowałem odpowiedź zgodnie z twoimi sugestiami. Dzięki
Mehul

28

Zaktualizowano do SWIFT 4 i poprawną odpowiedź na pytanie

Jeśli chcesz zaokrąglić w górę do 2 miejsc po przecinku, pomnóż przez 100, zaokrąglij i podziel przez 100

var x = 1.5657676754 
var y = (x*100).rounded()/100
print(y)  // 1.57 

1
Cześć - nie rozumiem, jak wykonujesz obliczenia pod kątem zwracania określonej liczby miejsc po przecinku. A jeśli chcę, aby zwracała 3 miejsce po przecinku?
Sipho Koza

@SiphoKoza po prostu pomnóż to przez 1000, a następnie podziel przez 1000
Chetan Rajagiri

To naprawdę nie jest „właściwa” odpowiedź, ponieważ wewnętrznie liczba jest zapisywana w postaci zmiennoprzecinkowej o podstawie 2, a próbujesz przedstawić liczbę o podstawie 10. W przypadku niektórych liczb nie ma dokładnej reprezentacji i skończysz ze zbyt dużą liczbą cyfr, gdy przejdziesz do wydrukowania wartości. Prawidłowa odpowiedź powinna zwrócić ciąg, a nie Double lub Float.
Victor Engel

@levan Działa również dla zera, tylko upewnij się, że jest podwójny
Chetan Rajagiri

1
Świetna odpowiedź, myślę, że to powinna być akceptowana.
אורי orihpt

13

Rozważ użycie NumberFormatter w tym celu, zapewnia większą elastyczność, jeśli chcesz wydrukować znak procentu współczynnika lub jeśli masz takie rzeczy, jak waluta i duże liczby.

let amount = 10.000001
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
let formattedAmount = formatter.string(from: amount as NSNumber)! 
print(formattedAmount) // 10

11

Dodając do powyższej odpowiedzi, jeśli chcemy wielokrotnie formatować Double, możemy użyć rozszerzenia protokołu Double jak poniżej:

extension Double {
    var dollarString:String {
        return String(format: "$%.2f", self)
    }
}

let a = 45.666

print(a.dollarString) //will print "$45.67"

1
Nie powinno być print (a.dollarString)?
glm4

5

Kod dla określonych cyfr po przecinku to:

var roundedString = String(format: "%.2f", currentRatio)

Tutaj% .2f mówi swiftowi, aby zaokrąglił tę liczbę do 2 miejsc po przecinku.


4

@Rounded , szybkie opakowanie właściwości 5.1 Przykład:

struct GameResult {
    @Rounded(rule: NSDecimalNumber.RoundingMode.up,scale: 4)
    var score: Decimal
}

var result = GameResult()
result.score = 3.14159265358979
print(result.score) // 3.1416


0

Tylko krótka odpowiedź dla noobów takich jak ja:

Możesz sprawić, że inne odpowiedzi będą bardzo łatwe do zaimplementowania, używając funkcji z wyjściem . Na przykład

  func twoDecimals(number: Float) -> String{
    return String(format: "%.2f", number)
}

W ten sposób, gdy chcesz pobrać wartość do 2 miejsc po przecinku, po prostu wpiszesz

twoDecimals (' Twój numer tutaj ')

...

Simples!

Ps Możesz również sprawić, by zwracał wartość Float lub cokolwiek chcesz, konwertując ją ponownie po konwersji typu String w następujący sposób:

 func twoDecimals(number: Float) -> Float{
    let stringValue = String(format: "%.2f", number)
    return Float(stringValue)!
}

Mam nadzieję, że to pomoże.


-1

jeśli dasz 234,545332233, otrzymasz 234,54

let textData = Double(myTextField.text!)!
let text = String(format: "%.2f", arguments: [textData])
mylabel.text = text

-3

Tylko jedna linia kodu:

 let obj = self.arrayResult[indexPath.row]
 let str = String(format: "%.2f", arguments: [Double((obj.mainWeight)!)!])
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.