Arredondar duplo para 2 casas decimais

88

Como faço para arredondar currentRatiopara duas casas decimais?

let currentRatio = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)!
railRatioLabelField.text! = "\(currentRatio)"
Del Hinds
fonte
Você deseja arredondar apenas currentRatiopara duas casas decimais ou sempre arredondar para cima? Ex: você quer 3,141 -> 3,14 ou 3,141 -> 3,14?
JAL de
Olá JAL, quero que 3.149 seja exibido como 3.15. No entanto, 3.141 deve exibir 3.14. Obrigado
Del Hinds
Veja a primeira parte da minha resposta para o arredondamento correto.
JAL de

Respostas:

174

Use uma string de formato para arredondar até duas casas decimais e converter doubleem String:

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

Exemplo:

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

Se você quiser arredondar sua última casa decimal, pode fazer algo assim (obrigado Phoen1xUK):

let myDouble = 3.141
let doubleStr = String(format: "%.2f", ceil(myDouble*100)/100) // "3.15"
JAL
fonte
Precisa ser 3,15 se arredondar para duas casas decimais.
Matt Le Fleur
Achei que o OP queria apenas arredondar para duas casas decimais, arredondando para cima ou para baixo conforme necessário. Acabei de adicionar um comentário pedindo esclarecimentos.
JAL de
Olá Jal, Obrigado, Usei sua resposta que funcionou com uma pequena modificação da seguinte forma: - _ = Double (rxCurrentTextField.text!)! / Double (txCurrentTextField.text!)! railRatioLabelField.text! = String (formato: "% .2f", currentRatio)
Del Hinds
2
Esta resposta é para a pergunta: "Como exibir Double com dois dígitos no rótulo de texto" ou "... como string", esta resposta não responde à pergunta "Arredondar duplo para 2 casas decimais"
mnl
@JAL eu preciso de olny .5 ou 0 após o ponto Por ex. se temos 23,4 deve dar 23,5 e se 23,8 deve 24,0
guru
33

(Swift 4.2 Xcode 11) Extensão simples de usar: -

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

Usar:-

if let distanceDb = Double(strDistance) {
   cell.lblDistance.text = "\(distanceDb.round(to:2)) km"
}
Mehul
fonte
Brilhante. Na verdade, eu queria converter para a mesma propriedade (duplo). Sua extensão resolveu meu problema. Obrigado!
Marcelo dos Santos
:-)
Boa
Eu acho que a sua é a resposta correta. Gostaria apenas de adicionar uma modificação de sintaxe ao func. func round(to places: Int) -> Double {
23inhouse
1
@ 23inhouse, atualizei a resposta de acordo com suas sugestões. Obrigado
Mehul
29

Atualizado para SWIFT 4 e a resposta adequada para a pergunta

Se você quiser arredondar para 2 casas decimais você deve multiplicar por 100, depois arredondar e dividir por 100

var x = 1.5657676754 
var y = (x*100).rounded()/100
print(y)  // 1.57 
Chetan Rajagiri
fonte
1
Oi - Eu não entendo como você faz seu cálculo em termos de retornar um determinado número de casas decimais. E se eu quiser que ele retorne 3 casas decimais?
Sipho Koza
@SiphoKoza basta multiplicar por 1000 e dividir por 1000
Chetan Rajagiri
Esta não é realmente a resposta "adequada" porque internamente, o número é salvo em ponto flutuante, com sua base 2, e você está tentando representar um número de base 10. Para alguns números, não há uma representação exata e você acabará com muitos dígitos quando for imprimir o valor. A resposta adequada deve retornar uma string, não um Double ou Float.
Victor Engel
@levan Funciona para zero também, apenas certifique-se de que seja duplo
Chetan Rajagiri
1
Ótima resposta, acho que essa deve ser aceita.
אורי orihpt
15

Considere o uso de NumberFormatter para essa finalidade, ele fornece mais flexibilidade se você quiser imprimir o sinal de porcentagem da proporção ou se você tiver coisas como moeda e números grandes.

let amount = 10.000001
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
let formattedAmount = formatter.string(from: amount as NSNumber)! 
print(formattedAmount) // 10
Michael Yagudaev
fonte
Já passei por muitos, esta é de longe, a MELHOR solução! Muito obrigado!
kalafun 01 de
13

Adicionando a resposta acima, se quisermos formatar Double várias vezes, podemos usar a extensão de protocolo de Double como abaixo:

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

let a = 45.666

print(a.dollarString) //will print "$45.67"
Ankit garg
fonte
1
Não deve ser impresso (a.dollarString)?
glm4
4

O código para dígitos específicos após decimais é:

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

Aqui, o% .2f diz ao swift para fazer esse número arredondado para 2 casas decimais.

Merichle
fonte
4

@Rounded , um exemplo de wrapper de propriedade swift 5.1:

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

var result = GameResult()
result.score = 3.14159265358979
print(result.score) // 3.1416
Abhijith
fonte
2
String(format: "%.2f", Double(round(1000*34.578)/1000))

Saída: 34,58

Shobhit C
fonte
2

Apenas uma resposta rápida para iniciantes como eu:

Você pode tornar as outras respostas super fáceis de implementar usando uma função com uma saída . Por exemplo

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

Dessa forma, sempre que você quiser levar um valor para 2 casas decimais, basta digitar

twoDecimals (' Seu número aqui ')

...

Simples!

Ps Você também pode fazer com que ele retorne um valor Float , ou qualquer coisa que você quiser, convertendo-o novamente após a conversão de String da seguinte maneira:

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

Espero que ajude.

Dave Y
fonte
-1

se você der 234,545332233, terá 234,54

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

Apenas uma linha de código:

 let obj = self.arrayResult[indexPath.row]
 let str = String(format: "%.2f", arguments: [Double((obj.mainWeight)!)!])
Sr.Javed Multani
fonte