Alguém pode me dizer como arredondar um valor duplo para um número x de casas decimais no Swift?
Eu tenho:
var totalWorkTimeInHours = (totalWorkTime/60/60)
Com totalWorkTime
sendo um NSTimeInterval (duas vezes) na segunda.
totalWorkTimeInHours
vai me dar as horas, mas me dá a quantidade de tempo em um número tão longo e preciso, por exemplo, 1,543240952039 ......
Como arredondar isso para, digamos, 1,543 quando imprimo totalWorkTimeInHours
?
ios
swift
double
nstimeinterval
Leighton
fonte
fonte
round(_:)
,Double
round()
,NSString
initializer,String
initializer,NumberFormatter
, extensão dobro ou mesmoNSDecimalNumber
eDecimal
.Respostas:
Você pode usar a
round
função do Swift para fazer isso.Para arredondar a
Double
com precisão de 3 dígitos, multiplique-o primeiro por 1000, arredonde-o e divida o resultado arredondado por 1000:Além de qualquer tipo
printf(...)
ouString(format: ...)
solução, o resultado dessa operação ainda é do tipoDouble
.EDIT:
Quanto aos comentários que às vezes não funcionam, leia o seguinte:
O que todo programador deve saber sobre aritmética de ponto flutuante
fonte
let rate = 9.94999999999; Double(round(rate * 100) / 100);
Saída:9.94999999999, 9.949999999999999
Funciona apenas para impressão, mas como posso atribuí-la à variável?Extensão para Swift 2
Uma solução mais geral é a seguinte extensão, que funciona com o Swift 2 e iOS 9:
Extensão para Swift 3
No Swift 3
round
é substituído porrounded
:Exemplo que retorna Double arredondado para 4 casas decimais:
fonte
round(8.46 * pow(10.0, 3.0)) / pow(10.0, 3.0)
retorna8.460000000000001
. Fazer o mesmo com o Float, pelo menos nesse cenário , de fato parece funcionar:round(Float(8.46) * pow(10.0, 3.0)) / pow(10.0, 3.0)
rendimentos8.46
. Apenas algo digno de nota.No '*' candidates produce the expected contextual result type 'FloatingPointRoundingRule'
Para arredondar
totalWorkTimeInHours
para 3 dígitos para impressão, use oString
construtor que usa umaformat
string:fonte
String(format: "%.3f", 1.23489)
prints1.235
Com o Swift 5, de acordo com suas necessidades, você pode escolher um dos 9 estilos a seguir para obter um resultado arredondado de a
Double
.# 1 Usando o
FloatingPoint
rounded()
métodoNo caso mais simples, você pode usar o
Double
rounded()
método# 2 Usando o
FloatingPoint
rounded(_:)
método# 3 Usando a
round
função DarwinA Fundação oferece uma
round
função via Darwin.# 4 Usando um
Double
método personalizado de extensão criado com Darwinround
epow
funçõesSe você deseja repetir a operação anterior várias vezes, refatorar seu código pode ser uma boa idéia.
# 5 Usando o
NSDecimalNumber
rounding(accordingToBehavior:)
métodoSe necessário,
NSDecimalNumber
oferece uma solução detalhada, porém poderosa, para arredondar números decimais.# 6 Usando a
NSDecimalRound(_:_:_:_:)
função# 7 Usando
NSString
init(format:arguments:)
inicializadorSe você deseja retornar um
NSString
de sua operação de arredondamento, usar oNSString
inicializador é uma solução simples, mas eficiente.# 8 Usando
String
init(format:_:)
inicializadorO
String
tipo de Swift está em ponte com aNSString
classe da Foundation . Portanto, você pode usar o seguinte código para retornar aString
da sua operação de arredondamento:# 9 Usando
NumberFormatter
Se você espera obter uma
String?
da sua operação de arredondamento,NumberFormatter
oferece uma solução altamente personalizável.fonte
Decimal
, que é gratuitoNSDecimalNumber
.Decimal
é tipo e ofertas nativo do Swift apoio mais elegante para os operadores nativas como+
,-
, etc.NSDecimalRound(_:_:_:_:)
função. Obrigado.NumberFormatter
é a última opção, embora deva ser a primeira a apresentar números aos usuários. Nenhum outro método gera números localizados adequadamente.No Swift 2.0 e no Xcode 7.2:
Exemplo:
fonte
Este é um código totalmente trabalhado
Swift 3.0 / 4.0 / 5.0, Xcode 9.0 GM / 9.2 e superior
saída - 123
saída - 123,3
saída - 123.33
saída - 123.326
fonte
Com base na resposta de Yogi, aqui está uma função Swift que faz o trabalho:
fonte
No Swift 3.0 e no Xcode 8.0:
Use esta extensão da seguinte forma:
fonte
Swift 4, Xcode 10
fonte
O código para dígitos específicos após decimais é:
Aqui o% .3f informa rapidamente que o número é arredondado para três casas decimais. Se você quiser um número duplo, use este código:
var roundedString = Double(String(format: "%.3f", b))
fonte
Use a biblioteca Foundation Darwin incorporada
SWIFT 3
Uso:
Saídas: 12.988
fonte
Uma maneira prática pode ser o uso da extensão do tipo Double
Uso:
fonte
Se você deseja arredondar
Double
valores, use o SwiftDecimal
para não introduzir erros que possam surgir ao tentar fazer a matemática com esses valores arredondados. Se você usarDecimal
, ele pode representar com precisão os valores decimais desse valor arredondado de ponto flutuante.Então você pode fazer:
Em seguida, você pode obter o
Decimal
valor arredondado da seguinte maneira:E se você deseja exibi-lo com um número especificado de casas decimais (além de localizar a sequência do código de idioma atual do usuário), você pode usar um
NumberFormatter
:fonte
(4.81).roundedDecimal(to: 2, mode: .down)
retornará 4.8, em vez de 4,81, o usoDecimal(string: self.description)!
de um precisodecimalValue
Double
(torna-se4.8099999999999996
). Mas eu desaconselho o usodescription
(já que o arredondamento empregado não está documentado e está sujeito a alterações). Se você realmente quer fazer matemática decimal com precisão, você deve evitarDouble
por completo e deve usarDecimal
diretamente (por exemplo,Decimal(sign: .plus, exponent: -2, significand: 481)
ouDecimal(string: "4.81")
Mas não use.description
.description
método não é documentado nem garantido. Além disso, não está localizado. IMHO, é um erro usardescription
para outra coisa que não seja para fins de registro. Eu usaria o tempoDecimal
todo, evitando o usoDouble
total, ou apenas usaria um modo de arredondamento diferente. Ou, se necessário, use seu próprio método localizado que usa o algoritmo no estilo Grisu (mas isso parece desnecessário quando você sabe quantas casas decimais deseja arredondar). Mas eu evitaria confiar neste comportamento auxiliar dedescription
.Essa é uma espécie de solução alternativa longa, que pode ser útil se suas necessidades forem um pouco mais complexas. Você pode usar um formatador de números no Swift.
Suponha que sua variável que você deseja imprimir seja
Isso garantirá que ele seja retornado no formato desejado:
O resultado aqui será, portanto, "3,6" (arredondado). Embora essa não seja a solução mais econômica, eu a dou porque o OP mencionou a impressão (nesse caso, uma String não é indesejável) e porque essa classe permite que vários parâmetros sejam definidos.
fonte
eu usaria
e altere 0,3f para qualquer número decimal que você precisar
fonte
Ou:
Usando
String(format:)
:Escreva
Double
comoString
com%.3f
especificador de formato e, em seguida, volte paraDouble
Ou estenda
Double
para lidar com locais N-Decimais:Por cálculo
multiplique por 10 ^ 3, arredonde-o e divida-o por 10 ^ 3 ...
Ou estenda
Double
para lidar com locais N-Decimais:fonte
Este é um algoritmo mais flexível de arredondamento para N dígitos significativos
Solução Swift 3
fonte
A melhor maneira de formatar uma propriedade dupla é usar os métodos predefinidos da Apple.
FloatingPointRoundingRule é uma enumeração que possui as seguintes possibilidades
Casos de enumeração:
case awayFromZero Arredonde para o valor permitido mais próximo, cuja magnitude é maior ou igual à da fonte.
case down Arredonde para o valor permitido mais próximo que seja menor ou igual à origem.
case toNearestOrAwayFromZero Arredonde para o valor permitido mais próximo; se dois valores são igualmente próximos, aquele com maior magnitude é escolhido.
case toNearestOrEven Round para o valor permitido mais próximo; se dois valores são igualmente próximos, o mesmo é escolhido.
caso Zero Round até o valor permitido mais próximo, cuja magnitude é menor ou igual à da fonte.
case up Arredonde para o valor permitido mais próximo que seja maior ou igual à fonte.
fonte
arredondar um valor duplo para o número x de
NO decimal . de dígitos após decimal
fonte
Não é Swift, mas tenho certeza de que você entendeu.
fonte
Isso parece funcionar no Swift 5.
Bastante surpreso, já não existe uma função padrão para isso.
// Truncamento de casas duplas em n-decimais com arredondamento
fonte
Você pode adicionar esta extensão:
e chame assim:
fonte
Para evitar imperfeições de flutuação, use Decimal
ex.
1075,58 arredonda para 1075,57 ao usar o flutuador com escala: 2 e .down
1075,58 arredonda para 1075,58 ao usar o decimal com escala: 2 e .down
fonte
Eu achei isso perguntando se é possível corrigir a entrada de um usuário. Ou seja, se eles digitarem três casas decimais em vez de duas para um valor em dólar. Diga 1.111 em vez de 1.11, você pode corrigi-lo arredondando? A resposta por muitas razões é não! Com dinheiro acima de 0,001 acabaria por causar problemas em um talão de cheques real.
Aqui está uma função para verificar a entrada do usuário para muitos valores após o período. Mas o que permitirá 1., 1.1 e 1.11.
Supõe-se que o valor já tenha sido verificado para uma conversão bem-sucedida de uma String para uma Double.
fonte
fonte
Uso:
fonte
Aqui está um para SwiftUI se você precisar de um elemento Text com o valor numérico.
fonte