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)"

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"

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"
}

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 

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

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"

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.


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

2
String(format: "%.2f", Double(round(1000*34.578)/1000))

Saída: 34,58


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.


-1

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

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

-4

Apenas uma linha de código:

 let obj = self.arrayResult[indexPath.row]
 let str = String(format: "%.2f", arguments: [Double((obj.mainWeight)!)!])
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.