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.